性能分析
explain
explain select * from table_name1where id = (select id from table_name2 where time_range = 3 );
使用 explain 分析 sql 语句后, 会生成一系列数据, 这些数据不同的字段有不同的含义.
explain 的执行结果
id
id 是 SQL 执行的顺序. SQL 会按照从大到小的顺序来执行的.
select_type
| select 类型 | 含义 |
|---|---|
| simple | 不使用联合查询或子查询 |
| primary | 最外层的select |
| derived | from 子句的子查询 |
| union | union 中的第二个或后面的 select 语句 |
| union result | union 的结果 |
| dependent union | union 中的第二个或后面的 select 语句 |
| subquery | 子查询中第一个 select |
| dependent subquery | 子查询中的第一个 select,取决于外面的查询 |
table
type, 连接操作类型
这列很重要,显示了连接使用了哪种类型,有无使用索引。在各种类型的关联关系中,效率最高的是 System, 然后依次是const / eq_ref / ref /range/ index /all。一般而言,查询至少达到 range 级别,最好能 ref 级别,否则可能会出现性能问题。
- system,表只有一行,system表
- const
- eq_ref
- ref, 使用了不是唯一或主键的键或者是这些类型的部分是发生。
- range,使用索引返回一个范围内的行。比如使用 >或 <
- index。
- all,全表扫描。
possible_key
possible_key, Mysql 在搜索数据记录是可以选用的各个索引名key
key,Mysql 实际选用的索引ref
ref,显示使用哪个列或常数与key一起从表中选择行rows
rows,Mysql 认为它在找到正确结果之前必须扫描的记录数。extra
extra ,附加信息。Using filesort,表明Mysql 需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排列键值和匹配条件的全部行的行指针来;Using temporary,Mysql 需要创建一个临时表来存储结果。一般看到这两个信息就表明需要优化了。
