1, 什么是 MySQL 执行计划
要对执行计划有个比较好的理解, 需要先对 MySQL 的基础结构及查询基本原理有简单的了解.
MySQL 本身的功能架构分为三个部分, 分别是 应用层, 逻辑层, 物理层, 不只是 MySQL , 其他大多数数据库产品都是按这种架构来进行划分的.
应用层, 主要负责与客户端进行交互, 建立链接, 记住链接状态, 返回数据, 响应请求, 这一层是和客户端打交道的.
逻辑层, 主要负责查询处理, 事务管理等其他数据库功能处理, 以查询为例.
首先接收到查询 SQL 之后, 数据库会立即分配一个线程对其进行处理, 第一步查询处理器会对 SQL 查询进行优化, 优化后会生成执行计划, 然后交由计划执行器来执行.
计划执行器需要访问更底层的事务管理器, 存储管理器来操作数据, 他们各自的分工各有不同, 最终通过调用物理层的文件获取到查询结构信息, 将最终结果响应给应用层.
物理层, 实际物理磁盘上存储的文件, 主要有分文数据文件, 日志文件.
通过上面的描述, 生成执行计划是执行一条 SQL 必不可少的步骤, 一条 SQL 性能的好坏, 可以通过查看执行计划很直观的看出来, 执行计划提供了各种查询类型与级别, 方面我们进行查看以及为作为性能分析的依据.
2, 如何分析执行计划
MySQL 为我们提供了 explain 关键字来直观的查看一条 SQL 的执行计划.
explain 显示了 MySQL 如何使用索引来处理 select 语句以及连接表, 可以帮助选择更好的索引和写出更优化的查询语句.
下面我们使用 explain 做一个查询, 如下:
- mysql> explain select * from payment;
- +----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------+
- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------+
- | 1 | SIMPLE | payment | NULL | ALL | NULL | NULL | NULL | NULL | 16086 | 100.00 | NULL |
- +----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------+
- 1 row in set, 1 warning (0.01 sec)
查询结构中有 12 列, 理解每一列的含义, 对理解执行计划至关重要, 下面用一个表格的形式进行说明.
列名 | 说明 |
---|---|
id | SELECT 识别符,这是 SELECT 的查询序列号。 |
select_type |
SELECT 类型, 可以为以下任何一种:
|
table | 输出的行所引用的表 |
partitions | 如果查询是基于分区表的话,显示查询将访问的分区。 |
type |
联接类型。下面给出各种联接类型, 按照从最佳类型到最坏类型进行排序:
一般来说,得保证查询至少达到 range 级别,最好能达到 ref。
|
possible_keys | 指出 MySQL 能使用哪个索引在该表中找到行 |
key | 显示 MySQL 实际决定使用的键 (索引)。如果没有选择索引, 键是 NULL。 |
key_len | 显示 MySQL 决定使用的键长度。如果键是 NULL, 则长度为 NULL。在不损失精确性的情况下,长度越短越好 |
ref | 显示使用哪个列或常数与 key 一起从表中选择行。 |
rows | 显示 MySQL 认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。 |
filtered | 显示了通过条件过滤出的行数的百分比估计值。 |
Extra |
该列包含 MySQL 解决查询的详细信息
|
根据上述表格, 可以在执行计划分析上提供很好的帮助.
来源: http://database.51cto.com/art/201805/572680.htm