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的写法来达到选择合适索引的目的

总结

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

相关文章

  • MySQLexplain之ref和rows的使用

    MySQLexplain之ref和rows的使用

    在MySQL中,优化器通过分析表之间的引用关系、使用的索引列、以及估算查询所需读取的行数来优化查询,"ref"关键字显示被参考的索引列,如果可能,这个值会是一个常数,表示哪些列或常量用于查找索引列上的值,"rows"关键字表示优化器根据表统计信息及索引使用情况
    2024-10-10
  • 关于clickhouse几种create table的情况

    关于clickhouse几种create table的情况

    这篇文章主要介绍了关于clickhouse几种create table的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL数据库被锁定的问题解决

    MySQL数据库被锁定的问题解决

    本文主要介绍了MySQL数据库被锁定的问题解决方法,包括通过刷新错误连接、修改max_connection_errors的数量、执行flush host或者 mysqladmin flush-hosts等方式进行解决,感兴趣的可以了解一下
    2024-10-10
  • mysql中show指令使用方法详细介绍

    mysql中show指令使用方法详细介绍

    mysql中show指令使用过程中会经常遇到,在本文将为大家详细介绍下其具体的使用,需要的朋友不要错过
    2014-11-11
  • mysql5.7.24 解压版安装步骤及遇到的问题小结

    mysql5.7.24 解压版安装步骤及遇到的问题小结

    这篇文章主要介绍了mysql5.7.24 解压版安装步骤以及遇到的问题 ,文中给大家提出了解决方案,需要的朋友可以参考下
    2018-11-11
  • 开启mysql的binlog日志步骤详解

    开启mysql的binlog日志步骤详解

    这篇文章主要介绍了MySQL 5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • MySQL数据库改名的详细方法教程

    MySQL数据库改名的详细方法教程

    在很多人看来Oracle数据库一旦建好后,数据库的名字就不能改变了,其实不然,下面这篇文章主要给大家介绍了关于MySQL数据库改名的相关资料,需要的朋友可以参考下
    2023-03-03
  • Mac下安装mysql5.7 完整步骤(图文详解)

    Mac下安装mysql5.7 完整步骤(图文详解)

    本篇文章主要介绍了Mac下安装mysql5.7 完整步骤,具有一定的参考价值,有兴趣的可以了解一下,
    2017-01-01
  • MySQL添加索引的优化与实践

    MySQL添加索引的优化与实践

    在数据库中,索引是提升查询性能的核心工具之一,MySQL 提供了丰富的索引选项,使得我们能够根据不同的查询需求和数据量来设计和优化索引,本文将深入探讨 MySQL 中添加索引的一些常见问题、最佳实践以及如何在大数据量的表上高效添加索引,需要的朋友可以参考下
    2024-11-11
  • SQL性能优化之慢SQL查询方法与排查

    SQL性能优化之慢SQL查询方法与排查

    慢 SQL 是指执行时间超过预设阈值的 SQL 语句,本文主要来今天聊一聊sql优化的问题,怎么找到那些慢SQL,文中提供了一些常用的方法,希望对大家有所帮助
    2026-04-04

最新评论