MYSQL索引失效的场景有哪些

MYSQL的索引是我们提高查询效率的重要工具,MySQL中采用了B+树作为索引结构来减少磁盘IO次数去提高数据的检索性能。

但是在某些场景下,由于查询语句设计不合理,或者对MySQL的理解不够深入。索引有可能会失效,变为全表扫描,这对于大数据量的查询是非常低效的。

在MySQL中,索引失效的场景有以下几种:

1.在where子句中使用一些逻辑操作符,比如说 not in 或者 不等于/or 这样的一些操作,因为这些操作会导致MySQL无法进行索引查找。

2.对索引字段进行计算或者函数操作,比如说我们对日期字段做一个YEAR()函数的操作。

3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫
描。
如果是这样的条件where code like 'A % ',就可以查找CODE中A开头的CODE的位置,当碰到B开头的数据时,就可以停止查找了,因为后面的数据一定不满足要求。这样就可以利用索引了。

4.如果mysql估计使用全表扫描要比使用索引快,那么它会选择全表扫描。比如数据量小或者大部分行都满足where子句的时候。

5.在复合索引中,没有按照索引的最左前缀的顺序来查询。

6.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

7.索引无法存储null值,查询时,采用is null条件时,不能利用到索引,只能全表扫描。

为什么索引列无法存储Null值?
  • 索引是有序的。NULL值进入索引时,无法确定其应该放在哪里。(将索引列值进行建树,其中必然涉及到诸多的比较操作,null 值是不确定值无法比较,无法确定null出现在索引树的叶子节点位置。) 

避免这些常见索引失效的场景,能够帮助我们更好的利用索引,提高SQL的查询效率。

MySQL主要提供2种方式的索引:B-Tree索引,Hash索引

  B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN)。相当于二分查找。

  哈希索引只能做等于查找,但是无论多大的Hash表,查找复杂度都是O(1)。

  显然,如果值的差异性大,并且以等值查找(=、 <、>、in)为主,Hash索引是更高效的选择,它有O(1)的查找复杂度。

  如果值的差异性相对较差,并且以范围查找为主,B树是更好的选择,它支持范围查找。

你可能感兴趣的:(mysqlsql)