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 作者 ...
随机推荐
- 闲着没事,用STC12C5616AD制作一个74hc595测试仪
手头有些特别廉价的直插74hc595,怕这些595因为廉价而质量不过关,因而萌发了制作一个测试仪的想法. 用测试仪先对595进行测试,功能正常了,再接入电路应用. 该测试仪能自动向595写入数据,再读 ...
- 画(HB To Ryby!)
"客人,请描述得具体一点." 他似乎还是很难为情. "呃--就是--一个女孩儿",他又勉强启开嘴,"女孩儿"三个字几乎被咽进嗓子 ...
- Java后台管理框架的开源项目
1.ThinkGem / JeeSite(开发人员/项目名称) JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您想学习Java平台的最佳学习案例,JeeSite还是接私活的最佳 ...
- ConcurrentLinkedQueue深度源码剖析
在Java的并发包中,存在着许多高效的并发工具类,它优于synchronized关键字,在JDK中提供了一个ConcurrentLinkedQueue工具类实现了高效的并发读写工具类,该工具类具有很高 ...
- java多线程---总结(2)
ThreadPoolExecutor 官方API解释线程池的好处: (1)通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销. (2)对线程进行一些维护和管理,比如定时开始,周期执行,并发数控 ...
- (原创)[开源][.Net Standard 2.0] SimpleMMF (进程间通信框架)更新 v1.1,极低CPU占用
一.前言 在上一篇 (原创)[.Net] 进程间通信框架(基于共享内存)--SimpleMMF 中,发布了v1.0版,最大的问题是:CPU占用较高,至少40-50%. 这既与我的开发水平有关,也与Si ...
- ChatGpt怎么玩
注册 梯子 先找好梯子, 归属地最好是米国之类的, 否则提示 OpenAI's services are not available in your country. 注: 最好用固定代理, 如tro ...
- 重拾 SSH:从基础到安全加固
安全外壳协议(Secure Shell Protocol,简称SSH)是一种加密的网络传输协议,属于应用层协议.OpenSSH 是最流行的 SSH 实现,它是大量操作系统的默认组件 OpenSSH 套 ...
- 解决当前标识(IIS APPPOOL\XXXX)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的写访问权限的问题
1.问题描述 在Windows Server2019数据中心版中搭建IIS项目,访问的时候出现如下所示的错误: 当前标识(IIS APPPOOL\XXXX)没有对"C:\Windows\Mi ...
- pip安装MySQLdb报错mysql_config not found
报错EnvironmentError: mysql_config not found解决方法 1.sudo apt-get install python-setuptools 2.sudo apt-g ...