通过对查询语句的分析,可以来了解查询语句的执行情况,找出查询语句执行的瓶颈,从未进行优化查询语句。
EXPLAIN语句的基本语法
explain select select_options
我们通过explain语句进行查询
explain select * from class;
下面我们对查询结果进行分析
id:select识别符。这时select的查询序列号
- 如果为子查询,则id 的数字越大,则优先级越高
- id如果为相同,可以认为是同一组,从上往下进行查询
- 在所有组中,id越大则优先级越高
select_type:连接类型
- SIMPLE表示简单查询,其中不包括连接查询和子查询
- PRIMARY:表示主查询,或者是最外层的查询语句
- UNION表示连接查询的第二个或者后面的查询语句
- UNION RESULT:表示连接查询的结果
- DERIVED表示导出表的select
table:表示查询的表
type:表示表连接的类型
- system:该表只有一行数据,这是const的一种特例,但是实际几乎不会出现,因为在实际开发中不可能出现一张表只存有这一行数据的现象
- const:表示通过索引一次就找到了,const用于primary,unique索引。因为其只匹配一条数据。若将主键置于where中,mysql就能将其转换成一个常量
eq_ref:唯一性索引扫描,对于每个索引值表中只有一条记录与之匹配。常见与主键或者唯一索引扫描
ref:对于来自前面表的任意行组合,将从该表中读取所有匹配的行。
range:只检索给定范围的行,使用一个索引来选择行。当使用=,<>,>,>=,<,<=,<,is null,<=>,between或者in操作符,用常量比较关键字时,类型为range
index:该连接类型与ALL相同。但它只扫描索引树,因为所以文件通常比数据文件小,通常比ALL更快
ALL:进行全表扫描,出现呢这种情况是,需要通过建立索引来进行优化sql查询语句
上面所提到的连接类型是最为常见的类型,其性能依次降低
possible_key:指出mysql能使用哪个索引在该表中进行查询,若为null,则没有相关索引
key:表示在查询中mysql实际用到的锁引,若为null,则实际查询中没有用到索引,可能是没有相关索引或者索引失效
key_len:表示mysql选择的索引字段按字节计算的长度
ref:表示使用哪个列或者常数与索引一起查询记录
rows:显示mysql在查询时必须检查的行数
Extra:表示mysql在处理查询时的详细信息
- using filesort(性能非常差):说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。mysql中无法利用索引完成的排序称为文件排序。
- using temporary(性能非常差):新建了内部临时表,使用了临时表保存中间结果。常见于order by,group by,所以分组和排序一定要按照锁建立的索引的名字和顺序.