使用 explain 分析语句
id 标识一个子查询
id相同执行顺序由上至下。
id不同,id值越大优先级越高,越先被执行。
id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。
select_type 查询类型
type:访问方法
ALL 扫描全表数据
index 遍历索引
range 索引范围查找
index_subquery 在子查询中使用 ref
unique_subquery 在子查询中使用 eq_ref
ref_or_null 对Null进行索引的优化的 ref
fulltext 使用全文索引
ref 使用非唯一索引查找数据
eq_ref 在join查询中使用PRIMARY KEYorUNIQUE NOT NULL索引关联。
possible_keys
对某表进行单表查询时可能用到的索引
key
经过查询优化器计算不同索引的成本,最终选择成本最低的索引
key_length 索引长度
ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows
如果使用全表扫描,那么rows就代表需要扫描的行数
如果使用索引,那么rows就代表预计扫描的行数
extra 的信息非常丰富,常见的有:
Using index 使用覆盖索引
Using where 使用了用where子句来过滤结果集
Using filesort 使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。
Using temporary 使用了临时表
使用命令:
show variables like 'log_slow_queries' 是否开启慢查询
show variables like 'show_query_log' 是否开启慢查询日志
set global show_query_log_file = '/.../slow.log' 日志位置
set global log_queries_not_using_indexes = on; 记录没有使用索引的语句
set global long_query_time = 1; 记录超过1秒的语句
在my.ini里配置:
log-slow-queries = '/.../slow.log'
log-queries-not-using-indexes = on
long_query_time = 1
慢查询日志分析工具:
mysqldumpslow(官方) 一般集成在MySQL安装包中 pt-query-digest
set profiling=on 开启profile,记录sql语句的详细执行信息