使用explain 命令再解决数据库性能上是第一推荐命令,
语法:explain select ... from ... [where ...]
输出
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 查询序列号 | select的类型 | 那张表 | 连接使用了那种类别,有无索引 | 列出Mysql能使用哪个索引再表中找到行 | 显示MySQL实际使用的键 | 使用的键长度。越短越好 | 使用哪个列或常数与key一起从表中选择行 | 执行查询时必须检查的行数 | 解决查询的详细信息 |
详解:
1.select_type的类型:
- SIMPLE:简单select,不适用UNION或子查询等
- PRIMARY:最外面的select
- UNION:UNION中的第二个或最后的select语句
- DEPENDENT UNIN:UNION中的底月个或后面的select语句,取决于外面的的查询。
- UNION RESULT:UNION的结果
- SUBQUERY:子查询的第一个select
- DEPENDENT SUBQUERY:子查询中的第一个select,取决于外面的查询
- DERIVED:导出表的select(from子句的子查询)
2.Type,显示连接使用了哪种类型,有无使用索引
- 结果从好到坏依次是:
1
2
3
4
5system > const > eq_ref > ref > fulltext > ref_or_null >
index_merge > unique_subquery > index_subquery > range >
index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,
否则就可能会出险性能问题。
3.Extra解决查询得详细信息
- Distinct :一旦MySQL找到了与行相联合匹配得行,就不再搜索了
- Not exits: 优化了left join ,一旦他找到了匹配left join标准的行 就不再搜索了。
- Record: 没有找到理想的索引,
- Using filesort:看到这个查询就需要优化了,
- Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生再表的全部的请求列都是同一个索引的时候。
- Using temporary:查询需要优化,MySQL需要创建一个临时表来存储结果,这通常发生再不同的列集进行order by上,而不是Group By上。
- Using where: 使用了where从句来限制那些行将于下一张表匹配或者是返回给用户。
另:
- 当type显示为“index”时,并且Extra显示为“using Index”,表明使用了覆盖索引。