网站首页 > 技术文章 正文
在前面的文章中讲解了sql语句的优化策略
https://www.toutiao.com/article/7296743360012845602/
sql语句的优化重点还有一处,那就是—— 索引!好多sql语句慢的本质原因就是设置的索引失效或者根本没有建立索引!今天我们就来总结一下那些无效的索引设置方式进而避免大家踩坑!看到这里有的同学会问:what?设置的索引还会失效?没错!接下来就让我们细细道来,文章非常有用,建议大家收藏。
不满足最左匹配原则
建立联合索引:idx_code_age_name。
该索引字段的顺序是:
code
age
name
以下会走索引
select * from user where code='101';
select * from user where code='101' and age=21
select * from user where code='101' and age=21 and name='Kevin';
select * from userwhere code = '101' and name='Kevin';
以下不会走索引
select * from user where age=21;
select * from user where name='Kevin';
select * from user where age=21 and name='Kevin';
使用了select *
如果select *语句中的查询列,都是索引列,那么这些列被称为覆盖索引。这种情况下,查询的相关字段都能走索引,索引查询效率相对来说更高一些;而使用select *查询所有列的数据,大概率会查询非索引列的数据,非索引列不会走索引,查询效率非常低。
索引列上有计算
例如 select * from user where id+1=2; 索引会失效
索引类用了函数
例如 select * from user where SUBSTR(height,1,2)=17;索引会失效
字段类型不同
字段类型不同索引会失效,例如设置code 为varchar,类型使用语句select * from user where code="101" 会走索引,如果我们不小心写成select * from user where code=101,则索引失效。因为code字段的类型是varchar,而传参的类型是int,两种类型不同导致索引失效。注意有一个例外就是int类型的参数,不管在查询时加没加引号,都能走索引。
like左边包括%
目前like查询主要有三种情况:
like '%a'(索引无效)
like 'a%'(索引有效)
like '%a%'(索引无效)
列对比
如果把两个单独建了索引的列,用来做列对比时索引会失效。例如: select * from user where id=height
使用or关键字
要么不用or要么将or的条件列都加索引(新版本mysql8以上,mysql5.6 or 索引无效)会采用索引合并的方式优化查询。
Not in 和not exists
主键字段中使用not in关键字查询数据范围,仍然可以走索引。而普通索引字段使用了not in关键字查询数据范围,索引会失效;
not exists时,索引也会失效。
order by 的坑
前提:已经建了联合索引:idx_code_age_name。
1.配合limit一起遵循最左匹配原则
explain select * from user order by code limit 100;
explain select * from user order by code,age limit 100;
explain select * from user order by code,age,name limit 100;
注意 order by不满足最左匹配原则,不会走索引。例如select * from user order by name limit 100
2.order by还能配合where一起遵循最左匹配原则。
例如:select * from user where code='101' order by age;
3.order by后面如果包含了联合索引的多个排序字段,只要它们的排序规律是相同的(要么同时升序,要么同时降序),也可以走索引。
注意:如果使用不同的排序规则不会走索引,例如select * from user order by code asc,age desc limit 100
具体sql如下:
explain select * from user order by code desc,age desc limit 100;
4.如果某个联合索引字段,在where和order by中都有也可以走索引
explain select * from user where code='101' order by code, name;
5.如果order by语句中没有加where或limit关键字,该sql语句将不会走索引。
6.对多个索引(注意:不是联合索引)进行order by不会走索引
我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!
猜你喜欢
- 2024-10-28 MySQL查询为什么没走索引?这篇文章带你全面解析
- 2024-10-28 什么情况会导致 MySQL 索引失效?(mysql什么情况下会导致索引失效)
- 2024-10-28 用了索引一定就有用吗?如何排查?(使用索引)
- 2024-10-28 MySQL 索引优化分析:为啥你的SQL慢?为啥你建的索引常失效?
- 2024-10-28 MySQL基础(索引分析和使用)(mysql各种索引的使用场景)
- 2024-10-28 MySQL基础(其它SQL优化)(mysql数据库优化及sql调优)
- 2024-10-28 除了网络问题之外,即使对于数据量较小的表
- 2024-10-28 研究了 4.7 个小时终于了解到了索引使用了却没变快的原因
- 2024-10-28 MySQL索引失效带来的性能瓶颈:如何解决这个棘手问题?
- 2024-10-28 常见mysql索引失效条件(常见mysql索引失效条件是什么)
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)