Mysql索引失效 数据库表中有索引还是查询很慢


Posted in MySQL onMay 15, 2022

前言:

问题分析:

在进行数据库查询的时候,我们都知道索引可以加快数据查询的效率。但是在实际的业务场景下,经常会遇到即使在表中增加了索引,但是同样还是会出现数据查询慢的问题。这就需要具体分析数据查询慢的具体原因到底是什么了。

首先需要进行确认的就是 SQL 语句中对应的条件查询中字段有没有建立索引。虽然说表中已经有索引,但是不一定 SQL 语句中的查询字段有建立索引,所以第一步应该进行 SQL 中的字段索引确认。如果没有建立对应的索引可以先尝试下建立索引再进行查询。如果已经有了索引,查询的字段也是索引字段,那么就要考虑下是不是出现了索引失效的情况。下面我们再具体分析下,看看在哪些场景下会出现索引失效的情况。

索引失效场景:

在分析索引失效场景之前,我们必须要清楚索引结构的特点是什么。

我们再来看下 Mysql 数据库索引的结构特点:

Mysql索引失效 数据库表中有索引还是查询很慢

本文以 user_info 这张表来作为分析的基础,在 user_info 这张表上,我们分别创建了 idx_name 以及 idx_phone 二级索引以及 idx_age_address 联合索引。

1、字段类型不匹配导致的索引失效

进行 SQL 数据查询的时候,where 条件字段类型与实际表中字段类型不匹配的时候,Mysql 会进行隐式的数据类型转换,而类型转换会使用到内置函数,导致在进行数据查询的时候并没有使用索引。我们可以使用 explain 命令查看 sql 语句。可以看的出来在 key 栏中,对应的值为 null,说明并没有使用索引进行查询。

Mysql索引失效 数据库表中有索引还是查询很慢

但是如果在按照 phone_number 字段为字符串类型进行查询的时候,Mysql 没有进行隐式的类型转换,所以最终还是走了索引。

Mysql索引失效 数据库表中有索引还是查询很慢

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

在 where 中条件使用了条件表达式的时候,数据表中的索引就失效了,实际是因为 Mysql 需要将索引字段取出来之后再进行表达式的条件判断,因而进行了全表扫描,导致索引失效。

Mysql索引失效 数据库表中有索引还是查询很慢

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

索引字段实际上是依赖于整个 B+索引树的遍历,而索引树的遍历又依赖于索引树底层叶子节点的有序性。索引保存的是索引列的原始值,如果经过函数计算,Mysql 的解释器无法判断计算后的索引在原来的索引树上是否可以被索引到,因此它就直接放弃使用索引查询了。

Mysql索引失效 数据库表中有索引还是查询很慢

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

使用左模糊匹配以及左右模糊匹配都会导致索引失效,但是使用右模糊匹配,还是可以走索引查询的。

Mysql索引失效 数据库表中有索引还是查询很慢

由于 B+树按照索引值进行排序的,实际是按照最左前缀进行比较,而使用了 %作为最左前缀,Mysql 无法判断其有序性,因此只能进行全表扫描查询。

Mysql索引失效 数据库表中有索引还是查询很慢

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

如果数据库表中有联合索引的话,我们在 SQL 查询语句中使用的索引字段又不是联合索引的最左字段,那么就会导致索引失效。

Mysql索引失效 数据库表中有索引还是查询很慢

实际上在 Mysql 中的索引检索是遵循最左匹配原则的,同时 B+索引树的叶子节点的有序性也是建立在最左匹配原则之上,而上述的 4、5 两种情况实际违反了最左匹配原则,因此 Mysql 执行器则无法使用对应的索引进行检查查询。

Mysql索引失效 数据库表中有索引还是查询很慢

6、or 分割的条件

如果 or 左边的条件存在索引,而右边的条件没有索引,不走索引
因为 OR 的含义就是两个只要满足一个即可,因此只有一个条件列进行了索引是没有意义的,只要有条件列没有进行索引,就会进行全表扫描,因此索引的条件列也会失效。

Mysql索引失效 数据库表中有索引还是查询很慢

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

Mysql索引失效 数据库表中有索引还是查询很慢

这里需要说明的是使用 in 以及 not in 走不走索引,实际和 Mysql 的版本以及表中的数据量有关系,在 8.0 之后的版本是走索引的。

注:此处加了地址的索引。

总结

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

到此这篇关于为什么Mysql 数据库表中有索引还是查询慢的文章就介绍到这了,更多相关Mysql 查询慢原理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL深分页问题解决思路
Dec 24 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 MySQL
MySQL查询日期时间
May 15 #MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 #MySQL
MySQL 计算连续登录天数
May 11 #MySQL
mysql 获取相邻数据项
May 11 #MySQL
MySQL脏读,幻读和不可重复读
May 11 #MySQL
MySql数据库 查询时间序列间隔
May 11 #MySQL
Mysql中常用的join连接方式
May 11 #MySQL
You might like
PHP 可阅读随机字符串代码
2010/05/26 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
删除重复数据的算法
2006/11/23 Javascript
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
用python发送微信消息
2020/12/21 Python
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
巴西世界杯32强口号
2014/06/05 职场文书
新农村建设汇报材料
2014/08/15 职场文书
趣味运动会广播稿
2014/09/13 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电