1. EXPLAIN的用法
EXPLAIN是MySQL的一个关键字,当在SELECT语句前加上该关键字,即可知道:MySQL是如何执行SQL查询的,如:查询时是否正确使用索引,MySQL是否采用最优的表连接。
2. EXPLAIN输出的列信息
字段 | 描述 |
---|---|
id | SQL语句执行的顺序 |
select_type | SELECT的类型 |
table | 查询出的行所用的表 |
type | 连接类型 |
possible_keys | 可能使用的索引 |
key | 实际使用的索引 |
key_len | 使用的索引的长度 |
ref | 使用哪一列或常数与索引进行比较 |
rows | 估计需要查找的条数 |
extra | My解决查询的详细信息 |
该列输出MySQL如何解析查询的附加信息。要想让查询尽可能的快,当该列的值出现 Using filesort 和 Using temporary时,请注意优化。
Using filesort: 通常发生排序的列没有用上索引,导致全表检索。
ex:explain select * from s_order order by pay_out_sn;
Using temporary: 为了解析查询,MySQL需要创建一个临时表来保存记录。这种情况经常发生在group by 和 order by作用在不同列上。
ex:explain select * from s_order group by seller_id order by buyer_id;
4.优化案例
优化前:explain select * from s_order where order_id in (select order_id from s_order_goods where buyer_id=10);
优化后:explain select o.* from s_order as o join (select order_id from s_order_goods where buyer_id=10) as oid on oid.order_id=o.order_id ;
优化using filesort
查询用户商品评论,根据geval_showtime排序,尽管geval_showtime定义了索引,可是MySQL优化器采用了其它索引.
优化方法:from evalute_goods left join .... => from evalute_goods use_index(geval_showtime) left join...