mysql学习记录 - explain命令

 

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

  1. idspa

    咱们上面执行select语句的顺序号,固然若是对多个表进行分析它若是是一条sql里面的,生成的id其实都是同样的。这其实不重要,咱们只要知道只是个序列号就好了,固然若是该select是引用的其余结果集的并集时,这是id为会null.net

  2. 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

  3. table:就是select执行的表名,没什么好说的

  4. partitions:非分区表该字段为null,能够使用show table status from fescar命令查看Create_options字段

  5. 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:全表扫描

  6. 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

    从结果集看到列出了使用了的索引名称

  7. key:展现mysql决定使用的索引名称,上图能够看到该值为PRIMARY

  8. key_len:选择的密钥的长度,若是key为null,则该值为null

  9. ref:显示将哪些列或常量与键列中命名的索引进行比较以从表中选择行。

  10. rows:匹配的行数

  11. filtered:经过where之类过滤后剩余的数据

  12. Extra:其余信息,好比上面的Using index之类的

对于explain的总结就这么多了,下次记录下真实场景下的explain调优实例,毕竟总归要实践才能体现价值。

相关文章
相关标签/搜索