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个任务。

相关推荐
龙腾AI白云7 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
一 乐7 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
zzj_2626107 小时前
MySQL常用操作
数据库·mysql
其实防守也摸鱼8 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
haerapi8 小时前
把 PostgreSQL 复制巡检做成可审计闭环:确定性采集、阈值判定与受控模型归纳
数据库·postgresql
happylifetree8 小时前
Python09:核心语法-数据存储与运算-字面量
python
心之语歌8 小时前
Tkinter 画布基本梳理
运维·服务器·python
Wx-bishekaifayuan9 小时前
django个性化旅游路线推荐平台49005-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
微学AI9 小时前
不让每一步都调用最贵模型:用蓝耘智能路由改造自主式研究 Agent
数据库·人工智能·蓝耘
yjb.gz9 小时前
Oracle19 RAC查看集群状态及磁盘空间情况(巡检)
数据库