前言
MySQL提供explain关键字为我们提供语句SQL如何执行的信息,explain可用于 select,delete,insert,replace和update语句前。
select语句之前增加explain关键字,MySQL会在查询上设置一个标记,使语句执行时只会返回select语句的执行计划,但不执行select语句,使开发者可以根据执行计划开发者可特定策略提高SQL语句性能。该文主要参考自MySQL官方文档EXPLAIN Output Format。
explain返回结果列解析
id:标识SQL中的select执行顺序
- id相同时,查询语句从上往下查询
- id不同时,id越大的执行优先级越高
select_type:查询类型
table:执行的select查到是哪个表
partitions:查询将匹配记录的分区
type(access_type,重点):访问(连接)类型,表示获取所需数据行的方式
注:key可能会命中possible_keys中不存在的索引
若索引列允许NULL值,则该索引列长度比NOT NULL长度大1,如int类型索引列可空则使用该索引时key_len=5。varchar与char的实际长度会根据编码类型更改,在utf8编码环境下实际长度+2,可参考如下2图:
ref(不常用):将哪些列或常量与该key列中命名的索引进行比较,以从表中选择行。
当为索引列等值判断时该值为const;当为表间连接时则值为连接字段;当值为func,则使用的值是某些函数的结果,比较失败则为null。
rows:MySQL认为执行查询必须检查的行数
InnoDB引擎下,该数值只是估计值,不一定准确
filtered:将按表条件筛选的表行的估计百分比
最大值为100,意味着没有发生行过滤(即都符合条件),值从100减少表示过滤量增加。如列rows=3,filtered=66.7%,则最后查询出的列数约为2行,如(user_detail全量数据):
explain结果3 * 66.67约为2,如下图(实际并不一定准确):
Extra:有关MySQL如何解析查询的额外信息
常见的如Using Where、Using Index、Distinct等
explain只返回执行计划不执行语句逻辑
MySQL通过B+Tree查找规则找到数据所在的叶子页获取相关的Page Header、Page Dicectory等,便可得知所需数据大概有多少条,具体可参考 。如有错误,还请指出;如有不懂,以下参考:
閱讀更多 Wilson1995 的文章