文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

5.索引失效的原因(11种情况,详讲)

2023-09-11 11:34

关注

1)没有查询条件,或者查询条件的列没有索引,则不走索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30;EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30 AND classId=4;EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30 AND classId=4 AND NAME = 'abcd';

2)最佳左前缀法则

索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引

3)主键插入顺序

对于一个使用InnoDB存储引擎的表来说,在我们没有显式的创建索引时,表中的数据实际上都是存储在聚簇索引的叶子节点的。而记录又是存储在数据页中的,数据页和记录又是按照记录主键值从小到大的顺序进行排序,所以如果我们插入的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插,而如果我们插入的主键值忽大忽小的话,就比较麻烦了,假设某个数据页存储的记录经满了,它存储的主键值在1~100之间:

773117b56e2d4f14a60dced40593b3b0.png

如果此时再插入一条主键值为 9 的记录,那它插入的位置就如下图:

de1193a3f23f45a4a1d43c1392ef1e87.png

可这个数据页已经满了,再插进来咋办呢?

#4)计算、函数、类型转换(自动或手动)导致索引失效

能够使用上索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name LIKE 'abc%';#函数运算,索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';

5)类型转换导致索引失效

如果不带引号,就是数字,字符类型不匹配,不走索引。

#索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME = 123;#走索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME = '123';

6)范围条件右边的列索引失效

student.classId>20; 范围索引失效

#走了age索引,范围后面的索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM studentWHERE student.age = 30 AND student.classId>20 AND student.name = 'abc' ;EXPLAIN SELECT SQL_NO_CACHE * FROM studentWHERE student.age=30 AND student.name = 'abc' AND student.classId>20;

7)不等于(!= 或者<>)索引失效

#走索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name = 'abc' ;#索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name <> 'abc' ;EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name != 'abc' ;

8)is null可以使用索引,is not null无法使用索引

#使用索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age IS NULL;#无法使用索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age IS NOT NULL;

9)like以通配符%开头索引失效

#走索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME LIKE 'ab%';#索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME LIKE '%ab%';

10)查询条件包含or且字段列不含索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age = 10 OR classid = 100;

辅助索引+or+无索引的列:会先走索引列,但无索引的列会进行全表扫描,所以还不如不走索引,直接都全表扫描完事。

如果or前后都有索引,那么可能走索引,也可能不走索引。

11)数据库和表的字符集统一使用utf8mb4

统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效。

一般性建议:

●对于单列索引,尽量选择针对当前query过滤性更好的索引

●在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。

●在选择组合索引的时候,尽量选择能够包含当前query中的where子句中更多字段的索引。

●在选择组合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。

总之,书写SQL语句时,尽量避免造成索引失效的情况。

 

来源地址:https://blog.csdn.net/weixin_45783741/article/details/127034372

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯