1、什么是sql执行计划
执行计划,就是mysql如何执行一条Sql语句,包括sql查询的顺序、是否使用索引、以及使用索引的信息等,一条SQL性能的好坏,可以通过查看执行计划很直观的看出来,执行计划提供了各种查询类型与级别,方便我们进行查看以及为作为性能分析的依据。
2、sql的执行过程
数据库本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层。
-
应用层:这一层是和客户端打交道的,主要负责与客户端进行交互,建立链接,记住链接状态,返回数据,响应请求。
- 逻辑层:主要负责查询处理、事务管理等其他数据库功能处理。
- 物理层:实际物理磁盘上存储的文件,主要分为数据文件,日志文件。
以查询为例,首先应用层接受到查询sql之后,数据库会立即分配一个线程对其进行处理;第一步查询处理器会对SQL查询进行优化,优化后会生成执行计划;然后交由计划执行器来执行。计划执行器需要访问更底层的存储管理器,存储管理器来操作数据,他们各自的分工各有不同;最终通过调用物理层的文件获取到查询结构信息,将最终结果响应给应用层。
3、执行计划分析
在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,如下:
explain
SELECT
gc.*,u.user_name,u.head
FROM
tb_goods_comment gc,tb_goods gd,tb_user u
WHERE
gd.sid = 3
AND
gc.gid = gd.gid
AND
u.uid = gc.uid
ORDER BY gc.dateline DESC
得到下图的列表:
表头分析:
id:表示一个查询中各个子查询的执行顺序。id相同执行顺序由上至下;id不同,id值越大优先级越高,越先被执行;id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。
select_type:表示查询类型,常见值如下:
table:输出结果集的表(表别名)
type:访问类型,常见访问类型如下:
ALL | 全表扫描,遍历全表来找到匹配行,一般是没有where条件或者where条件没有使用索引 |
index | 索引全扫描,遍历整个索引来查询匹配行,并不会扫描表,一般是查询的字段都有索引的查询语句 |
range | 索引范围扫描,常用于<、<=、>、>=、between等操作,前提是比较的字段加了索引,如果没有索引,则会全表扫描 |
ref | 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行 |
eq_ref | 类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配 |
const/system | 根据主键primary key或者 唯一索引 unique index 进行的查询 |
NULL | MySQL不用访问表或者索引,直接就能够得到结果 |
possible_keys: 表示查询可能使用的索引
key: 实际使用的索引
key_len: 使用索引字段的长度
ref: 使用哪个列或常数与key一起从表中选择行。
rows: 扫描行的数量
filtered: 存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比)
Extra: 执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息,最主要的有一下三种: