Mysql索引失效场景

Mysql索引失效场景

 

序言

 
  众所周知在Mysql中,通过使用索引的方式可以加快查询速度,从而避免全文搜索;而索引本身就像图书馆中所有书籍目录,通过查询关键字就能快速找到目标书籍在几列几行,这便是索引的原理,下图是平常索引失效的集中情况

 

正文

1、or使用不恰当

例如:User表中的两个字段ID、Name,ID本身为主键,那么Mysql会为该字段默认添加聚簇索引;而Name却没有建立索引,如果,在查询条件 ID=12 or Name ='Jay'中,由于ID存在索引那么Mysql本应该走索引进行查询,但是。or关键词的使用导致最后会查询满足另一个条件Name ='Jay',此条件却没有索引,那么意味着必须走全局检索;Mysql此时就会优化查询逻辑,字段ID也不会走索引(因为没有必要了,在全文检索Name时额外加入ID条件就行了),这样就能避免第二次查询

select ID,name from user where ID = 12 or name = 'jay'
--ID 存在索引,name不存在索引,优化原因统一不走索引

 

2、最左匹配原则

想要完全理解最左匹配原则,则需要理解Mysql中的索引树- B+ TREE,了解B+ TREE后理解最左匹配原则就非常容易了;

 如上图所示,在Mysql组合索引中建立的索引匹配则是从最左往右进行匹配,如果,左边成立才会匹配邻近的下一个组合索引值,例如:组合索name,like组成,而查询的条件则是name ='jay',这时就会匹配组合索引name='jay'数据,如果,条件like='rapper'时则无法触发索引,因为,索引匹配原则遵循的就是最左匹配

3、not in not exists != <>

上述关键字和表达式无法触发索引,原因是无法通过索引匹配数据,只能通过全文遍历数据。

4、like %最左包含

like %最左包含会触发数据库的全文检索,检索时间会跟随数据而增长。

5、使用内置函数

在Mysql中的条件表达列中将Mysql内置函数作为第一人称条件会导致不走索引的情况,这钟情况下将内置函数至于第三人称即可。

6、索引参与运算、多个索引列进行比较 

索引列参与运算也会导致索引失效。

7、联表查询时各表编码集不一致

在使用多个表进行连接查询时,如果,各表之间的编码字符集不一致也会导致不走索引情况出现。

8、表中的数据量少

Mysql中会存在Sql查询/优化器,该优化器会优化用户组织的T-SQL语句和查询逻辑;如果表中的数据量太少,这种情况下则不用走索引查询,因为,全文遍历所耗费的时间很少。

9、没有创建索引

10、select*

使用select*时也会导致不走索引的情况出现;在阿里开发手册中,不建议使用*,无论是从编码逻辑还是执行速度上都不建议。

11、隐式转换

在查询表达式中使用与字段不对应的数据类型时,也会导致不走索引的情况出现。

总结

通过Mysql explain关键字可以解释当前sql执行情况,从而分析每个阶段查询的耗时情况,索引引用的情况。

posted @ 2023-01-13 10:27  一梦红楼  阅读(25)  评论(0编辑  收藏  举报