Mysql索引失效分析

一、前言

在实际项目中,我们会遇到在使用Mysql数据库时,使用了索引,但是查询依旧很慢,发现是索引失效了,从而导致查询效率下降,甚至全表扫描,影响数据库性能。那么以下就索引失效问题作相关分析。

二、索引失效的场景

1.使用like查询

如果使用了like查询并且以%开头,那么索引会失效。

分析:like模糊查询一般用在字符串的字段上,而字符串的排序规则为按字母字典顺序排序,当以%开头时,那么就无法确定前面的字符,也就无法使用到索引。

例如:

csharp 复制代码
EXPLAIN SELECT * FROM user WHERE name LIKE '王%';

此时索引type为range,使用二级索引进行范围查询。

当前面加上%时:

csharp 复制代码
EXPLAIN SELECT * FROM user WHERE name LIKE '%王%';

此时索引type为ALL:全表扫描

2.索引列上使用函数。

分析:由于索引保存的是索引字段的原始值,而不是经过函数计算后的值,也就没办法走索引了。

例如:

csharp 复制代码
explain select * from user where length(name) = 2;

这时候索引是失效的。

3.复合索引失效。

如果使用了复合索引,但查询时未使用索引的第一列,也会导致索引失效。

分析:复合索引是按照索引字段排序的,从第一个字段开始,比如(a1,a2,a3)这三个字段复合索引,排序规则是先按a1字段进行排序,a1字段相同再按a2字段排序,当a1、a2字段都相同时再按a3字段进行排序。如果查询条件中没有使用到第一列,那么该索引也就没有办法使用,也就是说索引失效了,因此,使用复合索引需要遵守最左匹配原则。

例如:

csharp 复制代码
EXPLAIN SELECT * FROM user WHERE a2 = '1' AND a3 = '2';

这时候因为没有用到a1,索引就失效了。

4.索引中进行表达式计算。

分析:因为索引保存的是索引字段的原始值,不是 id + 1 表达式计算后的值,所以无法走索引,只能通过把索引字段的值取出来,然后进行表达式的计算来进行条件判断,因此就是采用全表扫描的方式。

例如:

csharp 复制代码
EXPLAIN SELECT * FROM user WHERE id + 1 = 10;

5.使用了不等于(!= 或 <>)的查询条件。

分析:在进行查询时,如果使用了不等于的条件,MySQL可能会认为全表扫描更为高效,因此不会使用索引。

例如:

csharp 复制代码
SELECT * FROM user WHERE id!= 18;

6.使用了 OR 条件。

使用or操作符并且or两边的条件涉及到至少两个字段时,并且OR前后的任何一个条件列没有被索引,那么索引就会失效。

分析:MySQL中的索引是根据某个字段进行排序建立的。当使用or操作符,说明有两个条件其中某个条件成立即可,而当我们对某个字段使用索引时只能判断出对应字段的条件是否成立,即使不成立,另一个条件成立时该记录也符合我们要查询的结果。所以使用索引无法做出判断。

例如:

csharp 复制代码
EXPLAIN SELECT * FROM user WHERE id > 1 OR name = '张三';

其中id是主键,如果name列没有被索引,那么即使id列被索引,MySQL也不会使用这个索引。

三、总结

索引是提高MySQL查询性能的重要工具,但在某些情况下,索引也会失效,所以我们在使用索引前需要先了解索引失效的原因以及优化策略,这样便于更好的使用索引。

其次,索引也不能使用过多,否则会对数据库的写操作带来影响。

相关推荐
杨了个杨89821 分钟前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
睡不醒男孩0308231 小时前
第七篇:揭秘 PostgreSQL 数据库内核级管控:CLup 深度架构设计与高可用底座技术白皮书
数据库·postgresql·clup
cmes_love2 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
马士兵教育2 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
swordbob2 小时前
MySQL字符集陷阱:从Oracle迁移踩坑到utf8mb4强制规范
数据库·sql
snow@li3 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
牛油果子哥q3 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
十五年专注C++开发3 小时前
MySql中各种功能用sql语句实现总结
数据库·sql·mysql
云烟成雨TD3 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
数据库小学妹3 小时前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai