|NO.Z.00153|——————————|BigDataEnd|——|Java&MySQL.高级.V25|——|MySQL.v26|EXPLAIN_extra|
一、EXPLAIN_extra
### --- extra 介绍
——> Extra 是 EXPLAIN 输出中另外一个很重要的列,
——> 该列显示MySQL在查询过程中的一些详细信息
二、准备数据
CREATE TABLE users (
uid INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(20),
age INT(11)
);
INSERT INTO users VALUES(NULL, 'lisa',10);
INSERT INTO users VALUES(NULL, 'lisa',10);
INSERT INTO users VALUES(NULL, 'rose',11);
INSERT INTO users VALUES(NULL, 'jack', 12);
INSERT INTO users VALUES(NULL, 'sam', 13);
### --- Using filesort
EXPLAIN SELECT * FROM users ORDER BY age;
mysql> EXPLAIN SELECT * FROM users ORDER BY age;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
——> 执行结果Extra为Using filesort ,这说明,得到所需结果集,
——> 需要对所有记录进行文件排序。
——> 这类SQL语句性能极差,需要进行优化。
——> 典型的,在一个没有建立索引的列上进行了order by,就会触发filesort,
——> 常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序。
——> filtered 它指返回结果的行占需要读到的行(rows列的值)的百分比
### --- Using temporary
EXPLAIN SELECT COUNT(*),sex FROM users WHERE uid > 2 GROUP BY sex;
mysql> EXPLAIN SELECT uid,uname FROM users WHERE uname='lisa';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 20.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
——> 执行结果Extra为Using temporary ,
——> 这说明需要建立临时表 (temporary table) 来暂存中间结果。
——> 常见与 group by 和 order by,这类SQL语句性能较低,往往也需要进行优化。
### --- Using where
~~~ 此语句的执行结果Extra为Using where,表示使用了where条件过滤数据
EXPLAIN SELECT * FROM users WHERE age=10;
mysql> EXPLAIN SELECT * FROM users WHERE age=10;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 20.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
### --- 需要注意的是:
——> 1. 返回所有记录的SQL,不使用where条件过滤数据,大概率不符合预期,
——> 对于这类SQL往往需要进行优化;
——> 2. 使用了where条件的SQL,并不代表不需要优化,
——> 往往需要配合explain结果中的type(连接类型)来综合判断。
——> 例如本例查询的 age 未设置索引,所以返回的type为ALL,仍有优化空间,可以建立索引优化查询。
### --- Using index
——> 此句执行结果为Extra为Using index,说明sql所需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录。
EXPLAIN SELECT uid,uname FROM users WHERE uname='lisa';
mysql> EXPLAIN SELECT uid,uname FROM users WHERE uname='lisa';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 20.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
### --- Using join buffer
EXPLAIN SELECT * FROM users u1 LEFT JOIN (SELECT * FROM users WHERE sex =
'0') u2 ON u1.uname = u2.uname;
——> 执行结果Extra为Using join buffer (Block Nested Loop) 说明,
——> 需要进行嵌套循环计算, 这里每个表都有五条记录,内外表查询的type都为ALL。
——> 问题在于 两个关联表join 使用 uname,关联字段均未建立索引,就会出现这种情况。
——> 常见的优化方案是,在关联字段上添加索引,避免每次嵌套循环计算。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv005-mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」