author:zxwhtml
email:502513206@qq.commysql
@ Jishou University sql
1.前言
最近买了mysql的一个课程,基本已经看完第一轮了,第一轮只是留个印象在脑海中还不算深刻的理解,想一想最近好久没写过博客了,恰好来记录下学习的理解以及加深印象。数据库
2.Content
有关explain官方是这样解释的,explain提供mysql如何执行语句的信息,能够和select,delete,insert,replace,update命令一块儿使用。ide
The
EXPLAIN
statement provides information about how MySQL executes statements: 学习
explain select * from news
咱们在数据库中执行该条sql语句获得执行信息以下,顺带一提mysql每行输出都提供一个表的信息,若是你连表查询则下面就会多几行优化
看着参数不少好像彻底记不住的样子,不要怕,下面列一个表格对每个列进行完整的解释,完全拿下这行表格含义。url
-
idspa
咱们上面执行select语句的顺序号,固然若是对多个表进行分析它若是是一条sql里面的,生成的id其实都是同样的。这其实不重要,咱们只要知道只是个序列号就好了,固然若是该select是引用的其余结果集的并集时,这是id为会null.net
-
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调优实例,毕竟总归要实践才能体现价值。