logo

Mysql 数据库表中有索引为什么还是查询慢?

作者:技术小猪AI2022.02.24 16:38浏览量:301

简介:Mysql数据库表中有索引为什么还是查询慢?

作者:慕枫技术笔记
问题分析
在进行数据库查询的时候,我们都知道索引可以加快数据查询的效率。但是在实际的业务场景下,经常会遇到即使在表中增加了索引,但是同样还是会出现数据查询慢的问题。这就需要具体分析数据查询慢的具体原因到底是什么了。
首先需要进行确认的就是 SQL 语句中对应的条件查询中字段有没有建立索引。虽然面试官说了有索引,但是不一定 SQL 语句中的查询字段有建立索引,所以第一步应该进行 SQL 中的字段索引确认。如果没有建立对应的索引可以先尝试下建立索引再进行查询。如果已经有了索引,查询的字段也是索引字段,那么就要考虑下是不是出现了索引失效的情况。下面我们再具体分析下,看看在哪些场景下会出现索引失效的情况。

索引失效场景
在分析索引失效场景之前,我们必须要清楚索引结构的特点是什么。关于 Mysql 的数据库索引结构在之前的文章中已经进行了详细的分析,可以参见之前的文章。
这样理解Mysql索引,阿里面试官也给你点赞
我们再来看下 Mysql 数据库索引的结构特点:

本文以 user_info 这张表来作为分析的基础,在 user_info 这张表上,我们分别创建了 idx_name 以及 idx_phone 二级索引以及 idx_age_address 联合索引。
CREATE TABLE IF NOT EXISTS user_info (
id bigint(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
gender int(2) NOT NULL,
age int(10) NOT NULL,
phone_number VARCHAR(20) NOT NULL,
address VARCHAR(40) NOT NULL,
PRIMARY KEY ( id ),
KEY idx_name(name),
KEY idx_phone(phone_number),
KEY idx_age_address(age,address)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码
1、字段类型不匹配导致的索引失效
进行 SQL 数据查询的时候,where 条件字段类型与实际表中字段类型不匹配的时候,Mysql 会进行隐式的数据类型转换,而类型转换会使用到内置函数,导致在进行数据查询的时候并没有使用索引。我们可以使用 explain 命令查看 sql 语句。可以看的出来在 key 栏中,对应的值为 null,说明并没有使用索引进行查询。

2、被索引字段使用了表达式计算

3、被索引字段使用了内置函数

4、like 使用了 %X 模糊匹配

5、索引字段不是联合索引字段的最左字段

6、or 分割的条件,如果 or 左边的条件存在索引,而右边的条件没有索引,不走索引

7、in、not in 可能会导致索引失效

总结
本文总结了几种索引失效的场景,希望在大家平时项目开发时遇到类似的问题可以有对应的问题排查方向。导致索引失效的场景归结起来实际就是在索引使用上面存在瑕疵最终导致了索引失效的情况,这就像我们小时候打拳皇 97 一样,遥感和按钮的组合如果姿势不对,就没办法放出我们希望的大招。总之需要一些经验的积累,同时在写完 SQL 的时候可以进行执行检查,避免在线上出现索引失效的问题。

相关文章推荐

发表评论