MySQL学习笔记(Day017:Explain_2)
@(MySQL学习)
[TOC]
一. 作业解析
- 哪张原数据表中记录了Cardinality信息
1 | -- |
- 检查表的索引创建的情况,判断该索引是否有创建的必要
1 | -- |
索引是要排序的,建立索引越多,排序以及维护成本会很大,插入数据的速度会变慢,所以索引建立的多,不是仅仅是浪费空间,还会降低性能,增加磁盘IO
注意:MySQL5.6的版本STATISTICS数据存在问题
,截止5.6.28仍然存在,官方定性为Bug
作业一:在
MySQL5.6
中使用mysql.innodb_index_stats
得到索引的选择性(SELECTIVITY)
二. MySQL5.6安装sys库
1 | shell > git clone https://github.com/mysql/mysql-sys.git |
1 | mysql> select version(); |
三. Explain(二)
1. Explain输出介绍
列 | 含义 |
---|---|
id | 执行计划的id标志 |
select_type | SELECT的类型 |
table | 输出记录的表 |
partitions | 符合的分区,[PARTITIONS] |
type | JOIN的类型 |
possible_keys | 优化器可能使用到的索引 |
key | 优化器实际选择的索引 |
key_len | 使用索引的字节长度 |
ref | 进行比较的索引列 |
rows | 优化器预估 的记录数量 |
filtered | 根据条件过滤得到的记录的百分比[EXTENDED] |
extra | 额外的显示选项 |
(1). id
从上往下理解
,不一定 id 序号大的先执行
可以简单的理解为 id 相等的从上往下看,id 相等的从下往上看。但是在某些场合也
不一定适用
(2). select_type
select_type | 含义 |
---|---|
SIMPLE | 简单SELECT(不使用UNION或子查询等) |
PRIMARY | 最外层的select |
UNION | UNION中的第二个或后面的SELECT语句 |
DEPENDENT UNION | UNION中的第二个或后面的SELECT语句,依赖于外面的查询 |
UNION RESULT | UNION的结果 |
SUBQUERY | 子查询中的第一个SELECT |
DEPENDENT SUBQUERY | 子查询中的第一个SELECT,依赖于外面的查询 |
DERIVED | 派生表的SELECT(FROM子句的子查询) |
MATERIALIZED | 物化子查询 |
UNCACHEABLE SUBQUERY | 不会被缓存的并且对于外部查询的每行都要重新计算的子查询 |
UNCACHEABLE UNION | 属于不能被缓存的 UNION中的第二个或后面的SELECT语句 |
- MATERIALIZED
- 产生中间临时表(实体)
- 临时表自动创建索引并和其他表进行关联,提高性能
- 和子查询的区别是,优化器将可以进行
MATERIALIZED
的语句自动改写成join
,并自动创建索引
(3). table
- 通常是用户操作的用户表
- <unionM, N> UNION得到的结果表
排生表,由id=N的语句产生 由子查询物化产生的表,由id=N的语句产生
####(4). type
摘自姜老师的PDF,按照图上箭头的顺序来看,成本(cost)是从小到大
####(5). extra
- Using filesort:可以使用复合索引将filesort进行优化。提高性能
- Using index:比如使用覆盖索引
- Using where: 使用where过滤条件
Extra的信息是可以作为优化的提示,但是更多的是优化器优化的一种说明