MySQL 中使用索引一定有效吗?如何排查索引效果?
MySQL 中使用索引一定有效吗?如何排查索引效果?
虽然索引是提升 MySQL 查询性能的常见手段,但并不是所有情况下索引都会有效。索引的使用取决于查询条件、数据分布、索引设计等多个因素。如果索引未能有效使用,可能导致查询性能不如预期。
1. 索引未必一定有效的情况
以下是一些常见的导致 MySQL 不使用索引的情况:
(1)索引选择性差
如果索引列的数据选择性较低(例如:某个列的值大部分相同),索引可能不会被使用。此时,MySQL 会选择全表扫描,而不是使用索引,因为全表扫描的成本可能比索引扫描更低。
示例:
SELECT * FROM users WHERE gender = 'Male';
如果
gender列只有'Male'和'Female'两个值,索引选择性差,MySQL 可能选择全表扫描。
(2)范围查询
使用了范围查询(如
BETWEEN、>、<、LIKE等)时,索引会被部分使用,通常只能利用范围查询前的字段索引。示例:
SELECT * FROM users WHERE age > 30 AND name = 'Alice';
在这种查询中,
age > 30是范围查询,MySQL 可能只使用age索引,忽略name索引。
(3)对索引列使用了函数或表达式
在查询中对索引列使用了函数(如
YEAR(date_column))或进行表达式计算时,索引可能会失效,因为计算后值与存储的索引值不匹配。示例:
SELECT * FROM orders WHERE YEAR(order_date) = 2023;
YEAR(order_date)会导致索引失效,除非使用适当的索引,如索引覆盖完整的order_date列。
(4)隐式类型转换
在查询中,如果传入的查询条件数据类型与索引列的数据类型不同,MySQL 可能会进行隐式类型转换,导致索引失效。
示例:
SELECT * FROM users WHERE age = '25';
如果
age列是INT类型,而查询条件是字符串'25',会导致类型不匹配,进而导致索引失效。
(5)使用 OR 连接条件
在查询中使用
OR时,如果OR连接的条件不能充分利用索引,MySQL 可能会选择全表扫描。示例:
SELECT * FROM users WHERE name = 'Alice' OR age = 30;
如果
name和age列分别有索引,MySQL 可能不能有效使用这两个索引,而是选择全表扫描。
2. 如何排查索引效果
要确保索引的有效使用,并排查可能的索引问题,可以使用以下方法:
(1)使用 EXPLAIN 命令分析查询计划
EXPLAIN命令可以显示 MySQL 执行查询时选择的执行计划,帮助我们判断是否使用了索引。示例:
EXPLAIN SELECT * FROM users WHERE name = 'Alice' AND age = 30;
EXPLAIN的输出会显示是否使用了索引、使用了哪个索引、索引扫描的类型等信息。常见的
EXPLAIN输出解释:key:显示使用的索引。type:连接类型,ALL表示全表扫描,range表示范围扫描,ref表示索引查找。rows:MySQL 预计扫描的行数。
(2)使用 SHOW WARNINGS 排查索引失效原因
如果查询没有使用索引,MySQL 会通过
SHOW WARNINGS显示相关警告信息,指示索引未能使用的原因。示例:
SHOW WARNINGS;
(3)查看慢查询日志
通过启用慢查询日志,可以查看哪些查询可能因为没有使用索引而执行缓慢。
配置慢查询日志:
slow_query_log = 1
slow_query_log_file = /path/to/slow-query.log
long_query_time = 1
慢查询日志记录了执行时间超过指定阈值的查询,帮助我们定位可能的索引问题。
3. 优化索引使用的建议
(1)优化查询条件
- 确保查询条件字段与索引顺序匹配,尤其是在多列联合索引的情况下,遵循最左前缀原则。
(2)避免函数和类型转换
- 尽量避免在查询条件中使用对索引列的函数或表达式。保持查询条件与索引列的数据类型一致。
(3)减少不必要的 OR 操作
- 使用
IN替代OR,或者根据需要重写查询以避免导致索引失效的OR条件。
(4)增加覆盖索引
- 对查询中常用的字段,设计覆盖索引,这样 MySQL 可以直接从索引中返回结果,避免回表操作。
4. 总结
索引的使用并非在所有情况下都有效。要确保索引能够提升查询性能,除了合理设计索引,还需要排查影响索引使用的因素,如范围查询、隐式类型转换、函数应用等。通过使用 EXPLAIN 分析查询执行计划,结合慢查询日志和 SHOW WARNINGS,可以帮助排查和优化索引效果。
MySQL 中使用索引一定有效吗?如何排查索引效果?的更多相关文章
- MYSQL中常用的强制性操作(例如强制索引)
mysql常用的hint 对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的 ...
- mysql中一半会选择什么样的字段为索引?(含索引创建删除查看公式)
一.数据量庞大的数据做索引 二.该字段经常出现在where的后面,以条件形式存在,经常被用户搜索的字段 三.很少被增删改的字段,因为增删改后,索引会重新排序 索引的创建 create index 索引 ...
- Mysql中给有记录的表添加唯一索引
ALTER IGNORE TABLE neeqs ADD UNIQUE KEY `unique` (`seccode`, `enddate`, `f002v`);
- mysql中limit 和 limit 与 offset 的用法(效果相同,用法不通过)
例1,假设数据库表student存在13条数据. 代码示例: 语句1:select * from student limit 9,4 语句2:slect * from student limit 4 ...
- Mysql中索引的 创建,查看,删除,修改
创建索引 MySQL创建索引的语法如下: ? 1 2 3 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON ...
- MySQL中的空间扩展
目录 19.1. 前言 19.2. OpenGIS几何模型 19.2.1. Geometry类的层次 19.2.2. 类Geometry 19.2.3. 类Point 19.2.4. 类Curve 1 ...
- mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引
原文链接 我的归纳: (1)InnoDB的主键采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是索引值和数据本身(注意和MyISAM的不同). (2)InnoDB的二级索引不使用 ...
- MySQL中地理位置数据扩展geometry的使用心得
最近学习了些MySQL geometry数据存储和计算,在这里记录下. 1. 环境 geometry推荐在5.6版本以上使用,尽管大部分功能在5.5已经可用,除了距离计算函数st_distance等新 ...
- mysql中的key primary key 和unique key
mysql 中key就等同于index 所以 key:普通索引 unique key:唯一索引,就是这一列不能重复 primary key:主键索引,就是不能为空,且主键索引不是完全相同时,插入新数据 ...
- 探究MySQL中SQL查询的成本
成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本. IO成本:即将数据页从硬盘中读取到内存中的读取时间成本.通常1页就是1.0的成本. CPU成本:即是读取和检测是否满足条 ...
随机推荐
- Oracle数据快照设置
1.1 手册目的 该手册主要目的是用于生产环境排查问题及恢复用户误操作删除数据及程序错误导致数据丢失使用. 1.2 查看Undo表空间参数 在命令窗口查询Undo表空间的快照参数 1 show par ...
- [阿里DIN] 从论文源码梳理深度学习几个概念
[阿里DIN] 从论文源码梳理深度学习几个概念 目录 [阿里DIN] 从论文源码梳理深度学习几个概念 0x00 摘要 0x01 全连接层 1.1 全连接层作用 1.2 CNN 1.3 RNN 1.4 ...
- oracle 删除过期归档脚本
一.定时任务 crontab -e 编辑 每周6凌晨3点执行脚本 0 3 * * 6 . /home/oracle/scripts/arch_delete_before_60days_arch.sh ...
- FLink13--KeyByMaxByApp
一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 package net.xdclass.class9; import java.ut ...
- 最新demo版|如何0-1开发支付宝小程序之前期准备篇(一)
小程序作为目前一种轻量.便捷的应用.目前应用越来越广泛了. 很多没有开发经验的开发同学可能初次接触就是小程序开发,为了详细讲解下小程序开发的步骤,我会按照小程序的开发流程一步一步从零开始给大家介绍下如 ...
- CF2029C New Rating
思路(二分 + 数据结构优化DP) 大致题意为:一个值 \(x\) 初始为 \(0\),然后有一个数组 \(a\),遍历一次数组. 如果 \(a_i > x\),则 \(x + 1\). 如果 ...
- 当懒惰遇上AI:我如何用Coze让大模型帮我整理2.5万字课程笔记
能写代码绝不动手,能用AI绝不写代码 -- AI粉嫩特攻队信条 通过本文学会打造这个AI工具,只有一个要求:识字且会上网! 一个小困扰 有朋友最近在上一位大佬的线上直播课程,感叹道: "老师 ...
- allure 报告空白
在pycharm 运行py文件后生成的报告内容空白: 尝试方法 替换allure版本号---不好用 用命令生成.html测试报告,再以浏览器形式打开 ** ** 命令 allure generate ...
- PyCharm一直indexing,且永不停止。
- 带大家做了个 AI 项目,没想到这么简单!
大家好,我是程序员鱼皮,现在已经是全民 AI 时代了,咱们程序员更要想办法榨干 AI,把 AI 利用起来.前几天我一时兴起,直播用 2 多个小时的时间,从需求分析开始,带大家做了一个 AI 海龟汤游戏 ...