使用explain查询SQL的执行计划
示例:
explain select * from `discussions` where `title` like '%hh%' or `text` like '%hh%' or `catagory_id` in (select `id` from `catagories` where `name` like '%hh%') order by `created_at` desc limit 10 \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: discussions
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 86
Extra: Using where; Using filesort
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: catagories
type: unique_subquery
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: func
rows: 1
Extra: Using where
2 rows in set (0.00 sec)
explain返回各列的含义:
table:显示这一行的数据时关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
(const一般是主键或唯一索引,eq_reg一般是主键和唯一索引的范围查找,ref常见于联结查询即一个表是基于另一个索引的查找,range基于索引的范围查找,index对于索引的扫描,ALL表扫描)
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。
key:实际使用的索引。如果为NULL,则没有使用索引。
key_len:使用的索引的长度,在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MySQL认为必须检查的用来返回请求数据的行数
extra列需要主要的返回值:
Using filesort:当看到这个的时候,查询就需要优化了。MySQL需要进行额外的步骤来发现如何对返回的行排序。它根据联结类型以及存储键值和匹配条件的全部行的行指针来排序全部行
Using temporary:当看到这个的时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行order by上,而不是group by上
参考网站: