执行计划分析
执行计划的作用
将优化器选择的执行计划截取出来,便于管理员判断语句的执行效率
获取执行计划
mysql> DESC SELECT * FROM user_gender WHERE user_gender = 1;
+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | user_gender | NULL | ALL | NULL | NULL | NULL | NULL | 997566 | 10.00 | Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)分析执行计划
table
type
全表扫描
ALL (不走索引)
索引扫描
INDEX 全索引扫描(遍历整个索引树)
DESC SELECT ID FROM city;
RANGE 索引范围扫描( > >= < <= , BETWEEN AND , OR , IN , LIKE 说明:受BTREE索引双向指针的优化,> >= < <= LIKE 的效率高于 BETWEEN AND , OR , IN )
DESC SELECT ID FROM city WHERE ID > 1000;
REF 辅助索引等值查询
DESC SELECT * FROM city WHERE CountryCode = 'CHN';
EQ_REF (多表连接时,子表使用主键或唯一键作为连接条件)
DESC SELECT city.Name, country.Code, city.Population FROM city JOIN country ON city.CountryCode = country.Code WHERE city.Population < 100\G;
CONST / SYSTEM 主键或唯一键的等值查询
DESC SELECT * FROM city WHERE ID = 100;
NULL
possible_keys 可能用到的索引
key 真正选择的索引
key_len 索引覆盖长度(覆盖的是最大预留长度)
varchar(2) 在使用 utf8mb4 编码时
能存储2个 任意字符
无论存储的是中文英文数字符号,一个字符的都预留4个字节
在实际存储中一个中文占4个字节,一个英文字母或数字占1个字节
索引的覆盖长度是 2 x 4 + 1 + 2 = 11字节,其中后边的1为是否为空标记 ,2为变长字符首尾标记,可使用 LENGTH() 函数查看列所占实际字节数
Extra
实战分析
没有索引的情况下的查询结果:
有索引的情况下的查询结果:
Last updated