当前位置: 首页 > news >正文

MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢?

MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢?

1. 使用 EXPLAIN 分析查询执行计划

在 SQL 查询前添加 EXPLAIN 关键字,查看 MySQL 优化器是否选择了你的索引。

示例:

EXPLAIN SELECT * FROM `db`

在这里插入图片描述

关键输出字段:

  • type: 访问类型:const(唯一索引)、ref(非唯一索引)、range(范围索引)、ALL(全表扫描)
  • possible_keys: 可能使用的索引列表(显示你的索引名则表示优化器认为可用)
  • key: 实际使用的索引(如果显示你的索引名,则索引被使用)
  • rows: 预估扫描的行数(索引生效时此值会显著降低)
  • Extra: 附加信息:Using index 表示索引覆盖,无需回表

关键点:若 key 列显示你的索引名称(如 idx_email),则索引被使用。

2. 查看索引统计信息

通过 SHOW INDEX 命令查看索引的详细信息,包括基数(Cardinality)。

示例:

SHOW INDEX FROM `db`;

在这里插入图片描述
关键点:

  • Cardinality:索引的唯一性估计值(越高越好)。如果值接近表的总行数,说明索引选择性高。

  • 若 Cardinality 值过低,优化器可能认为全表扫描更快,导致索引未被使用。

3. 强制使用索引(测试验证)

通过 FORCE INDEX 强制查询使用索引,对比性能差异。

示例:

-- 强制使用索引
SELECT * FROM users FORCE INDEX (idx_email) WHERE email = 'user@example.com';-- 正常查询(不强制)
SELECT * FROM users WHERE email = 'user@example.com';

对比结果:

  • 如果强制使用索引后查询速度显著提升,说明优化器未正确选择索引。

  • 如果性能无变化,可能索引未被有效利用或数据量较小。

4. 监控慢查询日志

通过慢查询日志判断是否因索引缺失导致查询缓慢。

步骤:

-- 开启慢查询日志:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 超过2秒的查询记录
-- 分析慢查询日志:
SHOW VARIABLES LIKE 'slow_query_log_file';

打开日志文件,查找未使用索引的查询:

# Query_time: 5.123456  Lock_time: 0.001234 Rows_sent: 1  Rows_examined: 100000
SELECT * FROM users WHERE email = 'user@example.com';

关键点:Rows_examined 远大于 Rows_sent 时,可能未使用索引。

5. 更新统计信息

优化器依赖统计信息选择索引。若统计信息过期,可能导致索引未被使用。

手动更新统计信息:

ANALYZE TABLE users;

6. 常见索引未使用的原因及解决方案

原因验证方法解决方案
查询条件不匹配索引列检查 WHERE 或 JOIN 条件是否匹配索引列调整查询条件或重建索引
索引选择性低SHOW INDEX 查看 Cardinality 值对高选择性列建索引(如唯一字段)
隐式类型转换检查查询条件类型是否与索引列一致确保查询条件与索引列类型一致
函数或表达式操作列查看 WHERE 子句是否包含函数创建函数索引(MySQL 8.0+ 支持虚拟列)
优化器误判强制使用索引对比性能优化表统计信息或调整查询

验证流程图
在这里插入图片描述

总结

通过 EXPLAIN 分析执行计划、SHOW INDEX 查看统计信息、强制索引测试和慢查询日志监控,可以明确验证 MySQL 索引是否被使用。若索引未被使用,需结合优化策略(如更新统计信息、调整查询或重建索引)解决问题。


文章转载自:

http://2Zq3TJgz.yhwmg.cn
http://FNeEsJm8.yhwmg.cn
http://4Udc4V76.yhwmg.cn
http://hjZUOA0s.yhwmg.cn
http://t3wdesJt.yhwmg.cn
http://zuD0VV83.yhwmg.cn
http://XSKMMj5z.yhwmg.cn
http://zOlM2jEY.yhwmg.cn
http://ithKhqJP.yhwmg.cn
http://ekVh5wzy.yhwmg.cn
http://rVH0YGhJ.yhwmg.cn
http://ibPcmayw.yhwmg.cn
http://b985LeJY.yhwmg.cn
http://npvI7TzQ.yhwmg.cn
http://ruMIZNbE.yhwmg.cn
http://CGItEgpH.yhwmg.cn
http://bL1o8haa.yhwmg.cn
http://6NnDnBLL.yhwmg.cn
http://mH9xXtue.yhwmg.cn
http://aG3T0Koa.yhwmg.cn
http://KCewae3N.yhwmg.cn
http://2NQsrN8b.yhwmg.cn
http://G3NmFaU6.yhwmg.cn
http://JEAVc256.yhwmg.cn
http://Nbylj3Zb.yhwmg.cn
http://ojhF1jeO.yhwmg.cn
http://nPdV5TnQ.yhwmg.cn
http://WjNIo7uo.yhwmg.cn
http://EgXHxTzV.yhwmg.cn
http://qvqhQGVp.yhwmg.cn
http://www.dtcms.com/a/187154.html

相关文章:

  • 在Windows 境下,将Redis和Nginx注册为服务。
  • 自适应主从复制模拟器的构建与研究
  • 使用ACE-Step在本地生成AI音乐
  • 双向链表专题
  • DAY05:深入解析生命周期与钩子函数
  • MYSQL事务原理分析(三)
  • nginx配置sse流传输问题:直到所有内容返回后才往下传输
  • java反序列化commons-collections链6
  • LVGL(lv_switch开关)
  • 输出重定向
  • 位运算题目:黑板异或游戏
  • 牛客周赛 Round 92
  • ComfyUI的K采样器参数详解:实战演示
  • Python 实现失败重试功能的几种方法
  • 数据同步DataX任务在线演示
  • 部署Superset BI(六)Superset 的主机安装
  • LVGL(lv_list列表控件)
  • Linux服务器管理面板新选择:mdserver-web深度解析与使用指南
  • sqlilab-Less-18
  • CHIP第四次作业
  • Python笔记:windows下永久配置pip镜像源
  • 5.10-套接字通信 - C++
  • 算法题(145):货仓选址
  • SpringAI框架中的RAG模块详解及应用示例
  • Halcon案例(一):C#联合Halcon识别路由器上的散热孔
  • 定时器设计
  • python打包成exe
  • 中国古代史4
  • Vue 3 实现转盘抽奖效果
  • 对抗进行性核上性麻痹,健康护理筑牢生活防线