mysql explain、慢查询

使用 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 的信息非常丰富,常见的有:

  1. Using index 使用覆盖索引
  2. Using where 使用了用where子句来过滤结果集
  3. Using filesort 使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。
  4. 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语句的详细执行信息

 

posted @ 2020-05-27 20:00  是的哟  阅读(387)  评论(0)    收藏  举报