MySQL索引失效的几种情况汇总

 更新时间:2020年09月24日 15:09:48   作者:Achilles_Heel  
这篇文章主要介绍了MySQL索引失效的几种情况,帮助大家更好的理解和使用MySQL索引,感兴趣的朋友可以了解下

一.索引不存储null值

更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本
没Null值,不能利用到索引,只能全表扫描。
为什么索引列不能存Null值?
将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为null。
这样的话,null值实际上是不能参与进建索引的过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。

二.不适合键值较少的列(重复数据较多的列)

假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。
再加上访问索引块,一共要访问大于200个的数据块。
如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块少一些,肯定就不会利用索引了。

三.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')

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

四.索引失效的几种情况

1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

select * from tb1 where nid = 1 or name = 'seven@live.com';
 
 
 --特别的:当or条件中有未建立索引的列才失效,以下会走索引
   select * from tb1 where nid = 1 or name = 'seven';
   select * from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'

2.对于多列索引,不是使用的第一部分,则不会使用索引

3.like查询以%开头

select * from tb1 where email like '%cn';

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

elect * from tb1 where email = 999;

5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

6.普通索引的不等于不会走索引

- !=
 select * from tb1 where email != 'alex'
 
 --特别的:如果是主键,则还是会走索引
  select * from tb1 where nid != 123
- >
 select * from tb1 where email > 'alex'
 
 
 --特别的:如果是主键或索引是整数类型,则还是会走索引
  select * from tb1 where nid > 123
  select * from tb1 where num > 123

7.组合索引最左前缀

如果组合索引为:(name,email)

name and email -- 使用索引
name -- 使用索引
email -- 不使用索引

以上就是MySQL索引失效的几种情况汇总的详细内容,更多关于MySQL索引失效的资料请关注脚本之家其它相关文章!

相关文章

  • MySQ实现XA事务的具体使用

    MySQ实现XA事务的具体使用

    XA事务是一种分布式事务处理协议,本文主要介绍了MySQ实现XA事务的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • MySQL系列之一 MariaDB-server安装

    MySQL系列之一 MariaDB-server安装

    本文主要介绍了MariaDB-server安装的几种方式,文中通过代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Mysql查询所有表和字段信息的方法

    Mysql查询所有表和字段信息的方法

    这篇文章主要介绍了Mysql查询所有表和字段信息,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • MySQL深分页问题及三种解决方案

    MySQL深分页问题及三种解决方案

    本文主要介绍了MySQL深分页问题及三种解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • mysql 表空间及索引的查看方法

    mysql 表空间及索引的查看方法

    mysql 表空间及索引的查看方法,需要的朋友可以参考下。
    2011-07-07
  • MySql存储过程学习知识小结

    MySql存储过程学习知识小结

    这篇文章主要介绍了MySql存储过程学习知识小结的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • MySQL中Multiple primary key defined报错的解决办法

    MySQL中Multiple primary key defined报错的解决办法

    这篇文章主要介绍了MySQL中Multiple primary key defined报错的解决办法以及相关实例内容,有兴趣的朋友们学习下。
    2019-08-08
  • 详解MySQL多版本并发控制机制(MVCC)源码

    详解MySQL多版本并发控制机制(MVCC)源码

    MVCC,即多版本并发控制(Multi-Version Concurrency Control)指的是,通过版本链维护一个数据的多个版本,使得读写操作没有冲突,可保证不同事务读写、写读操作并发执行,提高系统性能
    2021-06-06
  • mysql 8.0.15 版本安装教程 连接Navicat.list

    mysql 8.0.15 版本安装教程 连接Navicat.list

    这篇文章主要为大家详细介绍了mysql 8.0.15 版本安装教程,连接Navicat.list,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • mysql5.5中文乱码问题解决的有用方法

    mysql5.5中文乱码问题解决的有用方法

    在使用MYSQL时遇到中文乱码的问题,表现为插入数据后查询时输出为??(乱码),下面这篇文章主要给大家介绍了关于mysql5.5中文乱码问题解决的有用方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-05-05

最新评论