author:zxw
email:502513206@qq.com
@ Jishou University
1.前言
最近买了mysql的一个课程,基本已经看完第一轮了,第一轮只是留个印象在脑海中还不算深入的理解,想想最近很久没写过博客了,刚好来记录下学习的理解以及加深印象。
2.Content
有关explain官方是这样解释的,explain提供mysql如何执行语句的信息,可以和select,delete,insert,replace,update命令一起使用。
The
EXPLAIN
statement provides information about how MySQL executes statements:
explain select * from news
我们在数据库中执行该条sql语句得到执行信息如下,顺带一提mysql每行输出都提供一个表的信息,如果你连表查询则下面就会多几行
看着参数很多好像完全记不住的样子,不要怕,下面列一个表格对每一个列进行完整的解释,彻底拿下这行表格含义。
-
id
我们上面执行select语句的顺序号,当然如果对多个表进行分析它如果是一条sql里面的,生成的id其实都是一样的。这其实不重要,我们只要知道只是个序列号就行了,当然如果该select是引用的其他结果集的并集时,这是id为会null
-
select_type
就是我们select语句的类型,select_type的类型一共有11种,不一一列出,就挑几个常见的来看
-
SIMPLE:简单查询,意思就是没有使用union的sql
-
PRIMARY:最外层的sql
-
UNION:UNION中的第二个或者更下层的sql
我们执行如下sql
EXPLAIN (select acct.id,ot.id from account_tbl as acct,order_tbl as ot where acct.user_id = ot.user_id and acct.user_id = 'U100000' limit 0,1 ) union all (select acct.id,ot.id from account_tbl as acct,order_tbl as ot where acct.user_id = ot.user_id and acct.user_id = 'U100000' limit 0,1)
得到的结果集如下,可以看到select_type为primary和union,可以看到第一个select被标注为PRIMARY意思是最外层的sql,而union下面的sql则被标注为union
-
-
table:就是select执行的表名,没什么好说的
-
partitions:非分区表该字段为null,可以使用
show table status from fescar
命令查看Create_options字段 -
type:链接类型,这个是我们关注的重点字段
-
system:系统表,const类型链接的特例。
-
const:常量级查询,速度非常快。对主键或者唯一索引进行匹配时当做常量处理
explain select * from storage_tbl where commodity_code = 'C100000' and id= 21
得到如下结果
-
eq_ref:除了先前两种类型最好的一种,当我们使用表链接操作时,如果连接使用的是主键索引或者非空的唯一索引时,就会产生该类型
explain select * from storage_tbl,test where storage_tbl.commodity_code = test.name
结果集如下
-
ref:如果索引不是主键或者非空唯一索引类型,则会产生此type
-
fulltext:全文索引
-
ref_or_null:如果使用了isNull
-
index_merge:索引合并优化
-
unique_subquery:使用in语句
-
range:当我们对索引使用范围查询时
-
index:仅扫描索引树
sql:
explain select storage_tbl.id from storage_tbl,test where storage_tbl.commodity_code = 'C100000'
这边进行了一个连表查询,并且仅对表一进行匹配,最后的结果如下我们对表2是没有进行匹配操作的,所以表二是走了整个索引树的查询,type为index,所以index类型实际上就是索引全扫描。如果你不想索引全扫描则可以加where判断条件
-
- all:全表扫描
-
possible_keys
列出sql语句中使用到的索引
sql:
explain select storage_tbl.id,storage_tbl.commodity_code from storage_tbl where storage_tbl.id = 21 and storage_tbl.commodity_code = 'C100000'
这里我有两个索引,id、commodity_code从结果集看到列出了使用了的索引名称
-
key:展示mysql决定使用的索引名称,上图可以看到该值为PRIMARY
-
key_len:选择的密钥的长度,如果key为null,则该值为null
-
ref:显示将哪些列或常量与键列中命名的索引进行比较以从表中选择行。
-
rows:匹配的行数
-
filtered:通过where之类过滤后剩余的数据
-
Extra:其他信息,比如上面的Using index之类的
对于explain的总结就这么多了,下次记录下真实场景下的explain调优实例,毕竟总归要实践才能体现价值。