今天MySQL数据库栏目介绍相关执行计划。
MySQL 系列的第三篇博客本文来源gao($daima.com搞@代@#码(网,主要内容是 MySQL 中关于 Explain 执行计划的分析,假如你已经知道如何分析执行计划,那么对于 SQL 调优也就信手拈来了。
纵观众多一二线大厂招聘时的岗位要求,但凡设计数据库的必定会要求有 SQL 调优的经验,这几乎已经成为与 Spring 不相上下的“八股文”类面试题。
要想进行 SQL 调优,首先需要知道 SQL 的执行情况,最直观的感觉当然是 SQL 语句执行的时间,然而除此之外,我们还可以通过执行计划来分析 SQL 语句的执行情况,从而进行调优。
1. Explain 简述
Explain 语句可以查看 MySQL 是如何执行这条 SQL 语句的,包括使用索引情况、扫描行数等,这些信息对于 SQL 调优来说十分重要,所以首先得看懂执行计划。
mysql> explain select * from user where name='one'; +----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+| 1 | SIMPLE | user | NULL | ref | a | a | 13 | const | 1 | 100.00 | Using index | +----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)复制代码
以上是一条简单查询语句的执行计划,这张表一共有12个字段,分别代表不同的含义,下面一一叙述。
id
: 表示 SQL 执行的顺序,值越大,优先级越高。若值相同,执行顺序由优化器决定。select_type
: 表示 select 查询语句的类型table
: SQL 语句查询的表名(或该表的别名),也可能是临时表等不存在的表partitions
: 查询语句涉及的分区信息type
: 关联类型(访问类型),决定了 MySQL 是如何查找表中行的。性能从最差到最优依次是ALL
,index
,range
,index_merge
,ref
,eq_ref
,const
,system
,NULL
possible_keys
: 展示了查询语句可以使用的所有索引key
: 展示了优化器决定采用的索引名称key_len
: 展示了 MySQL 使用索引长度的字节数ref
: 在key
列记录的索引中查找值所使用的列或常量rows
: 扫描行数的估值filtered
: 最终满足查询语句行数占存储引擎返回总行数的百分比Extra
: 其他执行信息
以上只是对执行计划表各个字段的名词解释,接下来我会通过实际的例子来帮助大家(我自己)更好地理解其中 select_type
, type
, key_len
, rows
, Extra
这些重要的字段。
2. Explain 详述
2.1 示例表结构
首先介绍本文中将用到的示例表表结构以及数据行:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(36) DEFAULT NULL COMMENT '姓名', `age` int(11) NULL DEFAULT NULL COMMENT '年龄', `email` varchar(36) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_age_name`(`age`, `name`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1;复制代码