SQL索引失效的场景有哪些
SQL优化里面主要是围绕索引来展开的,SQL优化的一大重点就是避免索引失效,因为索引失效就会导致全表扫描,数据量很大的情况下能明显感受到查询速度的降低。
下面说说索引失效的各种场景。
- 使用索引的时候,进行了类型的隐式转换。举个例子,比如person_no是varchar类型的12345,这时候查询应该是【select * from table where person_no='12345';】,这时候索引就是有效的,但是如果误把查询写成【select * from table where person_no=12345;】,也是能查出数据,但是会进行类型转换再进行匹配,这时候就会导致索引失效。其他类型的隐式转换(如 DATE 和字符串的转换)也可能导致失效,不同字符集的隐式转换(如 utf8mb4 和 latin1)也可能失效,查询的时候确保条件值与字段类型一致。
- where条件里用到or,如果两边字段都有索引,可能会触发索引合并(Index Merge);若一边无索引,则全表扫描。这里可以考虑为or条件中的字段添加索引,或用union替代or。
- 不符合最左前缀法则,如果建立了联合索引(A,B,C),在where条件中只使用了B和C条件,就会导致这个联合索引失效,所以一定要包含A。如果包含A和C的情况下,C的索引也是失效的,因为B不在条件中,所以如果想要C也生效就得加上B的相关条件。
- 用到is not null语法。当对某个字段创建索引的时候,该字段上大多字段都是有值的才有这个需求,此时如果字段允许 NULL 且存在索引,如果用is null查询为null的数据索引可能有效,但是用is not null查询非null的记录时,如果大部分数据非 NULL,优化器可能选择全表扫描,导致索引失效。
- 用到not in语法或者!=,查询不在某一集合以外的元素,会导致全表扫描。使用 left join 或 not exists 优化 not in。
- 用到>或者<或者between and语法,范围查询对当前列索引有效,但联合索引中后续列无法使用索引。例如【select * from table where a > 100 and b = 200;
a 走索引,b 无法走索引】,建议优化为将等值条件列放在联合索引左侧。
- 使用模糊查询like可能会导致索引失效,此时用'%xxx'匹配就必然会导致索引失效,如果用‘xxx%’这时候索引可能就还有用,简单来说就是模糊查询尽量不要匹配后缀,而是匹配前缀。如果使用全文索引(如 MySQL 的
FULLTEXT),可优化模糊查询。
- 对在条件中对索引列进行运算操作,也会导致索引失效。例如对person_no建立了单列索引,需要查询person_no的前三位是'123'的数据,查询语句为【select id,person_no from table where substring(person_no, 1, 3)='123'】,这时候进行了substring操作,导致了索引失效,所以查询的时候避免对索引列运算。
- 数据分步过于集中,例如性别字段,只有男和女两种可能,索引也不建议建立在这样的字段上。
SQL索引失效的场景有哪些的更多相关文章
- 3、MySQL 索引失效的场景
索引失效的场景: 1.没有 where 条件 直接看 SQL 语句 2.where 条件中所在的列没有建立索引 show index from t; 3.从表中取得数据超过某个阈值.通常认为是 ...
- MySQL索引失效的场景
WHERE字句的查询条件里有不等于号(WHERE column!=-),MYSQL将无法使用索引 类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=-),MYS ...
- 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景
大家好,我是melo,一名大三后台练习生 专栏回顾 索引的原理&&设计原则 欢迎关注本专栏:MySQL高级篇 本篇速览 在我们上一篇文章中,讲到了索引的原理&&设计原则 ...
- MySQL索引失效的几种场景
我们都知道建立索引能够提高查询效率,那么是不是任何情况下都能提高呢,当然不是的的,下面我们就来列举一些常见的索引失效的场景. 借用上一篇文章的dm_person_info表 在card_code列没加 ...
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...
- SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3); ...
- MySQL索引失效的常见场景
当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了. 1. ...
- SQL查询:『索引失效问题』
1.IN操作符 用IN操作符写出来的SQL直观简单.易于理解.但是在where条件中使用IN操作符是低效的.例如下面这条查询语句: SELECT * FROM tab_a WHERE id IN( S ...
- sql优化策略之索引失效情况二
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp63 接第一篇索引失效分析:http://grefr.iteye.co ...
- SQL优化 MySQL版 - 避免索引失效原则(二)
避免索引失效原则(二) 注:继上一篇文章继续讲解: 避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...
随机推荐
- Windows安全加固(四)
七.服务安全 1.禁用TCP/IP上的NetBIOS(协议所用端口139) 作用:禁用TCP/IP上的NetBIOS协议,可以关闭监听的UDP137.UDP138.UDP139端口. (1)使用快捷键 ...
- Flutter一些概念(一)
1 简述Flutter是什么以及它的主要优势 Flutter是一种由Google开发的开源移动应用开发框架,可以用于构建高度定制化.美观并且性能卓越的移动应用程序,其主要优势有: 跨平台,一次编码,可 ...
- 把.netcore console 安装到Windows 系统服务。
用个工具:NSSM 下载:最新的那个pre版本 http://www.nssm.cc/download 测试.netcore 的一个控制台程序(Console),仅仅用来定时写入一些日志, 代码如下: ...
- HBase的Memstore-schema-rowkey设计原则
schema设计原则 前提条件 使用HBase Shell或者Java API的HBaseAdmin来创建和编辑HBase的Schema,当修改列簇时,建议先将这张表下线. Configurati ...
- linux:用户管理
用户账号添加.删除.修改以及用户密码的管理 用户组的管理 涉及三个文件: /etc/passwd :存储用户的关键信息 /etc/group :存储用户组的关键信息 /etc/shadow :存 ...
- Ubuntu20.04配置CuckooSandbox环境
Ubuntu20.04配置CuckooSandbox环境 因为最近要做恶意软件分析,阅读论文发现动态分析的效果普遍比静态分析的效果要好一些,所以需要搭建一个动态分析的环境,查阅资料发现Cuckoo S ...
- linux实现人脸识别锁定解锁
环境 archlinux 桌面管理器i3wm 登录管理器 slim python 3.10.4 dlib pip install --user -i https://pypi.tuna.tsinghu ...
- 使用VS2022打开解决方案后每个项目都显示“不兼容”
1.问题描述 今天本地使用VS2022打开之前新建的项目(.Net6框架),突然出现每个项目都显示"不兼容"的问题,导致每个项目的文件都看不到了,如下图所示: 2.解决办法 鼠标右 ...
- Visual Studio各个版本密钥
1.VS2012 旗舰版:YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 2.VS2013 旗舰版:BWG7X-J98B3-W34RT-33B3R-JVYW9 专业版:XDM3T-W3T3 ...
- Windows11本地部署DeepSeek加速
技术背景 在上一篇文章中我们介绍了在Ubuntu Linux操作系统上部署了一个DeepSeek-R1:14B,再通过其他电脑远程调用模型进行生成的方法.这里我们介绍一下Windows11安装Olla ...