mysql如何评估SQL语句的索引开销_mysql性能追踪与分析

key表示实际选用的索引名,仅说明"选了哪个索引"而非"用得对";rows是优化器预估扫描行数,反映索引过滤效率,值接近全表行数常意味索引失效。EXPLAIN 看懂 key 和 rows 的真实含义MySQL 不会直接告诉你"这个索引花了多少毫秒",而是通过 EXPLAIN 暴露执行计划里的关键线索。key 字段显示实际用到的索引名,但很多人误以为只要非 NULL 就代表高效------其实它只说明"选了哪个索引",不等于"用得对"。rows 是优化器预估的扫描行数,不是返回行数,也不是磁盘 IO 次数,但它最能反映索引过滤效率。常见错误现象:rows 接近全表行数,但 key 显示用了索引,说明索引区分度极低(比如在 is_deleted TINYINT 上建索引),或者查询条件没触发最左前缀(WHERE status = ? AND created_at > ? 却只在 (created_at) 上建索引)。用 EXPLAIN FORMAT=JSON 查看 filtered 字段,它表示该条件下行被保留的概率(0--100),低于 10 常意味着索引失效风险高type 为 range 或 ref 通常合理;ALL 或 index 要警惕,尤其当 rows 过大时避免在 WHERE 中对索引字段做函数操作,如 WHERE YEAR(created_at) = 2024 会让 created_at 索引完全失效用 sys.schema_index_statistics 查真实索引使用频次优化器预估可能严重偏离实际。有些索引常年没人用,却拖慢写入性能;有些查询明明走了索引,但因回表开销大,整体反而更慢。MySQL 8.0+ 的 sys 库提供了运行时统计视角。使用场景:上线后想确认某条慢查询是否真靠索引提速了,或清理长期闲置的冗余索引。查某个索引被用了多少次:SELECT * FROM sys.schema_index_statistics WHERE table_name = 'orders' AND index_name = 'idx_user_id_status'注意 reads 是逻辑读次数,不是物理 IO;如果 reads 极低但 select_latency 很高,大概率是回表或排序导致瓶颈该视图不记录历史,重启 MySQL 后归零;若需长期追踪,得配合定期快照或开启 Performance Schema 的 events_statements_history_longoptimizer_trace 揭露为什么没选你期待的索引当你写了索引、EXPLAIN 却显示 key: NULL,别急着改 SQL------先打开优化器追踪,看它到底评估了哪些索引、成本怎么算的。这是定位"索引被忽略"类问题的唯一可靠方式。 There's An AI For That 全球领先的 AI 聚合器,收集10,225个AI工具,可用于超过2,548个任务。

相关推荐
lili0012几秒前
CC GUI 插件架构剖析:如何为 JetBrains IDE 打造完整的 AI 编程工作台
java·ide·人工智能·python·架构·ai编程
iuvtsrt2 分钟前
SQL如何高效提取大表前几行:分页查询与OFFSET优化
jvm·数据库·python
其实防守也摸鱼3 分钟前
ctfshow--Crypto(funnyrsa1-密码2)解题步骤
python·安全·web安全·网络安全·密码学·web·工具
WL_Aurora7 分钟前
备战蓝桥杯国赛【Day 15】
python·蓝桥杯
彳亍10112 分钟前
如何用 Dask 替代 Pandas 实现高效 Excel 数据处理
jvm·数据库·python
音符犹如代码13 分钟前
Docker 一键部署带有 TimescaleDB 插件的 PostgreSQL
java·运维·数据库·后端·docker·postgresql·容器
程序leo源16 分钟前
Qt信号与槽深度详解
c语言·开发语言·数据库·c++·qt·c#
2301_7838486518 分钟前
c++怎么把多个变量一次性写入二进制文件_结构体对齐与write【实战】
jvm·数据库·python
码界筑梦坊22 分钟前
123-基于Python的特斯拉超级充电站分布数据可视化分析系统
开发语言·python·信息可视化·数据分析·毕业设计·echarts·fastapi
wang3zc25 分钟前
如何在 WooCommerce 后台按订单总金额精准筛选订单
jvm·数据库·python