Mysql 解释计划
输出字段分为 id select_type table partitions type possible_keys key key_len ref rows filtered extra
1. select_type
INSERT DELETE UPDATE 增删改
查有多个
查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询
1、SIMPLE:简单的select查询,查询中不包含子查询或者union
(select * from atest1 t1 )
2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
(select * from atest1 where id = (select id from atest2 ) )
3、SUBQUERY:在select 或 where列表中包含了子查询
(同上)
4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里
2. table 表名
如果有别名,显示别名
3 partitions
查询使用到表分区的分区名。
4.type 核心属性
分为
system > const > eq_ref > ref > range > index > ALL
4.1 system:
无法重现
4.2 const
where 条件是主键
select * from atest1 where id =1 ;
select * from atest1 where index1 = "11";
4.2 eq_ref
无法重现
4.3 ref
查询普通索引
(select * from atest1 where index2 = "2";)
4.4
range
有范围的索引扫描
(select * from atest1 where index2 > 1 ;)
4.5 index
Full Index Scan,index与ALL区别为index类型只遍历索引树
(select id from atest1;)
4.6 ALL
全表扫描
(select * from atest1)
5
possible_keys
可能用到的索引名称,我测试下来,和 6 key都是一样的
(select * from atest1 where index2 > 1 ; 情况下 pk_index2 )
6 key
实际的索引名称
(select * from atest1 where index2 > 1 ; 情况下 pk_index2)
7 key_len
表示索引中使用的字节数,通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好显示的是索引字段的最大长度,并非实际使用长度;
(select * from atest1 where index2 > 1 ; 情况下 5 )
(select * from atest1 where index2 > 1 and id=1; 情况下 4)
8 ref
哪些列或常量被用于查找索引列上的值, 有可能为null
select * from atest1 where index2 > 1 and id=1; 情况下 const
9 rows
过滤后的行数
10 filtered
返回结果的行数占读取行数的百分比,值越大越好;
11 extra
包含不适合在其他列中显示但十分重要的额外信息。
根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好;
----------------
附sql:
CREATE TABLE `jpress`.`atest1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`normal1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`normal2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`index1` int(255) NULL DEFAULT NULL,
`index2` int(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `index1`(`index1`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
CREATE TABLE `jpress`.`atest2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`normal3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`normal4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`index3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`index4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `index3`(`index3`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
来源:oschina
链接:https://my.oschina.net/u/2382040/blog/3219440