408 字
2 分钟
如何用 EXPLAIN 读懂 MySQL 执行计划
EXPLAIN 展示优化器估算的访问路径,不是实际耗时报告。先看访问表的顺序和连接方式,再看 type、possible_keys、key、key_len、rows、filtered 与 Extra。type=ALL 表示全表扫描,是否有问题取决于表大小和过滤比例;key 为 NULL 表示该表访问没有选索引,但小表全扫可能更便宜。rows 和 filtered 是估算值,偏差可能来自统计信息或数据分布。
Extra 中 Using filesort 表示需要额外排序过程,不代表必定写磁盘;Using temporary 表示计划使用内部临时表,也不必然意味着落盘。Using index 通常表示覆盖索引访问;Using index condition 表示 ICP。MySQL 8.0 可用 EXPLAIN ANALYZE 实际执行并显示迭代器耗时和行数,注意它会真的运行查询,不能对有副作用语句随意使用。
EXPLAIN SELECT id, created_at FROM ordersWHERE user_id = 42 AND status = 'paid'ORDER BY created_at DESC LIMIT 20;先提出假设(例如过滤列缺复合索引),再比较执行计划和真实行数,不要机械追求 type=const 或某个漂亮字段。索引选择受成本模型、数据规模、统计信息和缓存状态影响。
追问
Using filesort就是磁盘排序吗? 不一定,表示需额外排序算法;数据量和配置决定是否使用磁盘临时空间。rows=100是实际读了 100 行吗? 不是,传统 EXPLAIN 给出优化器估算;用EXPLAIN ANALYZE对照实际执行数据。type=ALL一定要加索引吗? 不一定,小表或低选择性查询全扫可能更便宜,应看规模、频率和计划成本。
如何用 EXPLAIN 读懂 MySQL 执行计划
https://blog.xqcherry.top/posts/interview/mysql/explain-execution-plan/ 目录