最近项目开发中遇到的索引优化

news/2024/11/28 19:24:52/

简单的搜索功能会使用like

like语句的前导模糊查询不能使用索引,根据最左前缀原则,因为页面搜索严禁左模糊或者全模糊,如果需要可以使用搜索引擎来解决。

select * from doc where title like '%XX';   -- 不能使用索引
select * from doc where title like 'XX%';   -- 非前导模糊查询,可以使用索引

union、in、or 都能够命中索引,建议使用 in

一个是or的优化消耗CPU比较多,同时会导致数据库引擎放弃索引进行全表扫描,所以不推荐使用。而union和in的优化CPU消耗差不多,甚至union更好一些但不多,但是一般建议使用in会SQL语句简洁一些。对于开发者而言使用in会更加舒适一些。

select * from doc where status=1
union all
select * from doc where status=2;
​
select * from doc where status in (1, 2);

NULL

注意判断使用is null / is not null会无法使用索引,同时会导致全表扫描,一般我们都会给字段赋予默认值,避免这些特殊的情况。同时如果复合索引只要有一列有NULL值,那么该列对复合索引就无效了。

使用allow_null赋予字段,往往要注意一些特别的操作,例如在python web框架Django的serializer操作中加额外的操作会导致一些出乎意料的错误。

特殊操作

不要在索引列上面做任何操作(计算、函数、类型转换),否则会导致索引失效而转向全表扫描。

比如你的日期字段是对应到秒位的,但你偏偏用到日期位的去匹配;字符串类型的ID匹配却带整型去匹配,导致类型转换使索引失效。

计算、函数、类型转换等等操作,都建议在ORM操作的前后去处理它。同时现在WEB框架也不适宜去处理复杂的SQL类型,取出数据做额外操作为益,或用缓存等方式处理。

(个人在实践中发现用Redis去操作的收益是比较不错的)

 


http://www.ppmy.cn/news/46298.html

相关文章

Windows特性,个人理解

Windows是一款广泛使用的操作系统,它具有众多强大的特性和功能,可以满足不同用户的各种需求。本文将介绍Windows的一些主要特性,包括安全性、可靠性、易用性、可定制性等方面。 一、安全性 Windows具有强大的安全性能,包括以下几…

设计模式-结构型模式之外观模式

4. 外观模式 4.1. 模式定义 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个 高层接口,这个接口使得这一子系统更加容易使用。外观模…

图解ThreadLocal核心方法

1、put方法逻辑 #mermaid-svg-NLFi4sbsreWb2dTK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NLFi4sbsreWb2dTK .error-icon{fill:#552222;}#mermaid-svg-NLFi4sbsreWb2dTK .error-text{fill:#552222;stroke:#552…

【音视频第12天】GCC论文阅读(3)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的,找一找感觉。 目录 Abstract1. Introduction1.1 Mathematical notation conventions 2. System model2.…

2023年4月广东省计算机软考中/高级备考班招生简章

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

云原生可观测性平台deepflow部署

deepflow是什么 DeepFlow 是云杉网络 (opens new window)开源的一款高度自动化的可观测性平台,是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术,创新的实现了 AutoT…

FVM链的Themis Pro(0x,f4) 5日IDO超百万美元,领Filecoin重回高点

交易一直是 DeFi 乃至web3领域最经久不衰的话题,也因此催生了众多优秀的去中心化协议,如 Uniswap 和 Curve。这些协议逐渐成为了整个系统的基石。 在永续合约方面,DYDX 的出现将 WEB2 时代的订单簿带回了web3。其链下交易的设计,仿…

javaSccript---call()、 bind()、 apply()的区别

call()、apply()、bind() 都是用来重定义 this 这个对象的 语法: function.apply(thisArg, [argsArray])//argsArray 是一个可选的数组 function.call(thisArg, arg1, arg2, ...)//arg1、arg2、... 是将传递给函数的参数列表 function.bind(thisArg, arg1, arg2, ..…