mysql索引失效的几种情况及分析

 更新时间:2026年04月21日 10:22:09   作者:西瓜个球  
这篇文章主要介绍了mysql索引失效的几种情况及分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

索引的类型

针对InnoDB

  • 聚簇索引 :主键索引,b+树叶子节点指向的是真实数据;
  • 非聚簇索引:非主键索引,b+树叶子节点存储的是聚簇索引和非聚簇索引值;

全值索引 最佳左前缀法则失效

最佳左前缀法则:如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

但常量查询时,mysql会对搜索条件顺序进行优化

index(a,b,c)
where a= “a” and c= “c” and b = “b” 可以使用索引
where a= “a” order b,c 可以用到索引
where a= “a” order c,b 无法使用
where a= “a” order b,c 可以使用索引
where a= “a” and b = “b” order c,b 可以使用索引,因为b此时已经为常量;
where b=“b” 或者 where b=“b” and c=“c” 或者 where c =“c” ,无法使用索引,因为跳过了a列;

group by 基本上都需要进行排序,会有临时表产生。

不在索引列上做任何操作

(计算、函数、自动or手动类型转换),会导致索引失效而转向全表扫描。

存储引擎不能使用索引中范围条件右边的列

在范围条件之后索引全失效

尽量使用覆盖索引

mysql在使用不等于的时候无法使用索引,会导致全表扫描

is null 和is not null 也无法使用索引

like以通配符开头mysql索引时效会变成全表扫描

加在右边是范围查询;加在左边是全表扫描;对于必须使用两边百分号的数据,使用覆盖索引解决,查询字段与索引字段个数顺序一致;

index(a,b,c)
where a= “a” and b like"b%" and c=“c” ,可以使用索引,使用到a,b,c
where a= “a” and b like"%b" and c=“c” ,可以使用索引,只使用到a
where a= “a” and b like"%b%" and c=“c” ,可以使用索引,只使用到a
where a= “a” and b like"b%b%" and c=“c” ,可以使用索引,使用到a,b,c

字符串不加单引号索引失效

使用了mysql隐式的类型转换

少用or,用它来连接时会索引失效

左右连接查询索引建立方式

  • 左连接,加右表外键索引;因为是由左连接特性决定的,left join 条件用于确定如何从右表搜索行,左边一定有,而右边是我们的关键点。
  • 右连接,加左表外键索引;右连接相反同上。

一般性建议

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

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

在选择组合索引的时候,尽量选择可以包含当前query中的where字句中更多字段的索引;

尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解MySQL事务的隔离级别与MVCC

    详解MySQL事务的隔离级别与MVCC

    这篇文章主要介绍了MySQL事务的隔离级别与MVCC的相关资料,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-04-04
  • MySQL数据库远程访问权限如何打开(两种方法)

    MySQL数据库远程访问权限如何打开(两种方法)

    本文通过两种方法给大家介绍MySQL数据库远程访问权限的打开方法,非常不错,实用性非常高,感兴趣的朋友一起看看吧
    2016-05-05
  • MySQL的左连接、右连接、内连接用法解读

    MySQL的左连接、右连接、内连接用法解读

    这篇文章主要介绍了MySQL的左连接、右连接、内连接用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • MySQL的事件调度器使用介绍

    MySQL的事件调度器使用介绍

    这篇文章主要介绍了MySQL的事件调度器使用介绍,本文讲解了事件调度器的开启、创建、修改、删除等操作的使用实例,需要的朋友可以参考下
    2015-06-06
  • MySQL存储过程参数的用法及说明

    MySQL存储过程参数的用法及说明

    这篇文章主要介绍了MySQL存储过程参数的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 浅析MySQL如何实现百万级数据的高效查询

    浅析MySQL如何实现百万级数据的高效查询

    在当下的数据库技术背景下,处理 MySQL 百万级数据的查询需要综合考虑数据库设计、查询优化、硬件配置和高级技术,下面我们就来看看具体的实现方案吧
    2025-07-07
  • MySQL中的系统库(sys系统库、information_schema)调优方法

    MySQL中的系统库(sys系统库、information_schema)调优方法

    MySQL性能调优涉及数据库设计、查询优化、配置及硬件调整,MySQL性能调优是一个复杂且多维度的过程,下面从数据库设计、查询优化、配置参数调整、硬件优化几个方面为你介绍相关的调优方法,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 如何选择合适的MySQL存储引擎

    如何选择合适的MySQL存储引擎

    MySQL有多种存储引擎,MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
    2011-09-09
  • MYSQL关联关系查询方式

    MYSQL关联关系查询方式

    文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家
    2025-02-02
  • 安装使用Percona XtraBackup来备份恢复MySQL的教程

    安装使用Percona XtraBackup来备份恢复MySQL的教程

    这篇文章主要介绍了安装使用Percona XtraBackup来备份恢复MySQL的教程,文中的示例环境基于CentOS系统,需要的朋友可以参考下
    2015-12-12

最新评论