|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 byorder 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

 

posted on   yanqi_vip  阅读(14)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示