Explain执行计划分析
id
操作的唯一标识,值越大的操作越先执行
select_type
操作的类型,不同类型的查询效率不同.包括:
- simple,简单的select语句,查询中不包含自查询或者union
- primary,查询若包含任何复杂的子部分,最外层查询则被标记为primary
- subquery,在select或where列表中包含子查询
- derived,在from列表中包含自查询被标记为derived(衍生)MySQL会递归执行这些自查询,把结果放在临时表中
- union,若第二个select出现在union之后,则被标记为union.若 union包含在from子句子查询中,外层select将别标记为derived
- union result,从union表中获取结果的select
table
操作涉及的表
partitions
操作涉及的分区
type
查询使用的索引类型,按照性能排序如下
:::info
system > const > eq_ref > ref > range > index > all
:::
**system **
系统级,基本不会出现,忽略不计
count
常数索引,一般出现在使用唯一索引进行唯一性查询
eq_ref
唯一索引,只扫描一个匹配行
ref
非唯一索引,只扫描索引树的一小部分查找匹配行
range
范围扫描,使用索引范围查询,扫描索引树的一个范围查找匹配行
index
全索引扫描,遍历整个索引树查找匹配行,一般出现在不符合最左原则的查询
all
全表扫描,遍历全表查找匹配行,非索引字段查询
总结:
按照经验,查询应该优化到至少range级别,能达到ref最好
possible_keys
可能被查询优化器选择使用的索引
key
优化器选择使用的索引
key_len
索引的长度.长度越短,查询效率越高
ref
连接操作使用的索引
rows
操作需要扫描的数据行数
filtered
操作过滤掉的函数与扫描的行数的百分比.数值越大,查询得越准确
extra
额外信息,不在前面的列但是非常重要的其他信息,常见信息如下:
- Using filesort
使用文件排序,发生在无法使用索引排序时
- Using temporary
临时表保存中间结果;常见于排序order by和分组group by
- Using index
覆盖索引
- Using index condition
索引下推
- Using where
未索引覆盖,使用了where过滤
- Using join buffer
使用了链接缓存
- impossible where
where条件子句总是false
- distinct
优化distinct操作,在找到第一匹配的值后立即停止找相同值的动作
本文来自博客园,作者:{小小胡},转载请注明原文链接:https://www.cnblogs.com/xxhahn/p/17346849.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通