MySQL 性能分析Explain

一、MySQL性能优化

1.1 MySQL Query Optimizer的作用

MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:

通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划

ps:

MySQL认为最优的数据检索方式,但不见得是DBA认为是最优


当客户端向MySQL请求一条Query


命令解析器模块完成请求分类

区别出是SELECT时并转发给MySQL Query Optimizer

MySQL Query Optimizer的处理过程

对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值

对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等

分析Query中的Hint信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划

如果没有Hint 或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据Query进行写相应的计算分析

得出最后的执行计划

1.2 MySQL 常见瓶颈

CPU瓶颈

CPU在饱和的时候一般发生在数据装入在内存或从磁盘上读取数据时候


IO瓶颈

磁盘I/O瓶颈发生在装入数据远大于内存容量时


服务器硬件的性能瓶颈

top、free、iostat和vmstat来查看系统的性能状态


二、Explain概述

2.1 是什么

Explain 是查看执行计划


使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的。分析查询语句或是结构的性能瓶颈

官网地址:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

2.2 能干嘛

表的读取顺序(id 字段)

数据读取操作的操作类型(select_type 字段)

哪些索引可以使用(possible_keys 字段)

哪些索引被实际使用(keys 字段)

表之间的引用(ref 字段)

每张表有多少行被优化器查询(rows 字段)

2.3 怎么玩

Explain + SQL语句


mysql> explain select * from t_emp;

+----+-------------+-------+------+---------------+------+---------+------+------+-------+

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+------+-------+

|  1 | SIMPLE      | t_emp | ALL  | NULL          | NULL | NULL    | NULL |   10 |       |

+----+-------------+-------+------+---------------+------+---------+------+------+-------+

1 row in set (0.00 sec)