explain的使用
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在select语句之前增加explain关键字,Mysql会在查询上设置一个标记,执行查询会返回执行计划的信息,并不会执行这条SQL,就比如下面这个
SQL语句性能统计指标:
id: select语句标识符
select_type:select语句查询类型
table: 查询用到的表
partitions: 查询匹配到的分区
type:表连接类型
possible_keys:可能用到的索引
key:时间用到的索引
key_len:索引长度
ref:查询条件中的列
rows:预计扫描的行数
filtered:过滤行所占的百分比
Extra:附加信息
explain字段详解
id列
id表示查询语句的序号,自动分配,顺序递增,值越大,执行优先级越高 id相同是,优先级由上而下
select_type列
select_type表示查询类型,常见的有SIMPLE简单查询,PRIMARY主查询,SUBQUERY子查询、UNION联合查询、UNION RESULT联合临时表结果等。
table列
table表示SQL语句查询的表名、表别名、临时表名。
partitions列
partitions表示SQL查询匹配到的分区。没有分区的话显示NULL
type列
type表示表连接类型或者数据访问类型,就是表之间通过什么方式建立连接的,或者通过什么方式访问到数据的。具体有以下值,性能由好到差依次是:
system>const>eq_ref>ref>ref_or_null>index_merge>range>index>ALL
system:当表中只有一行记录,也就是系统表,是const类型的特例
const:表示使用主键或者唯一性索引进行等值查询,最多返回一条记录,性能较好,推荐使用。
eq_ref:表示表连接只有到了主键或者唯一性索引
ref:表示使用非唯一性索引进行等值查询
ref_of_null:表好似使用非唯一性索引进行等值查询,并且包含了null值的行
index_merge:表示用到索引合并的优化逻辑,即用到的多个索引
range:表示用到了索引范围查询
index:表示使用索引进行全表扫描
ALL:表示全表扫描,性能最差
possible_keys列
表示可能用到的索引列,实际查询并不一定能用到。
key列
表示实际查询用到的索引列
key_len列
表示索引所占的字节数。每种类型所占的字节数如下:
ref列
表示where语句或者表连接中与索引比较的参数,常见的有const(常量)、func(函数)、字段名。如果没用到索引,则显示为NULL
rows列
表示执行SQL语句所扫描的行数
filtered列
表示按条件过滤的表行的百分比 用来估算与其他表连接是扫描的行数,row x filtered=252004 x 10% =25万行
Extra列
表示一些额外的扩展信息,不适合在其他列展示,却又十分重要
Using wher:表示使用了wher条件搜索,但没有使用索引
Using index:表示用到了覆盖索引,即在索引上就查到了所需数据,无需二次回表查询,性能较好
Using filesort:表示使用了外部排序,及排序字段没有用到索引
Using filesort:表示使用了外部排序,即排序字段灭有用到索引
Using temporary:表示用到了临时表
Using join buffer:表示在进行表关联的时候,没用用到索引,使用了连接缓存去存储临时结果。
Using index condition :表示用到索引下推的优化特性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通