mysql性能优化器explain
explain作用:
使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈。
通过explain可以得到以下信息:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
语法:
explain + sql语句
主要字段包括id、select_type、table、partitions、type、possible_keys、key、ref、rows、filtered、extra,各字段含义如下:
id:
- select查询的序列号,表示查询执行select字句或操作表的顺序,执行顺序从大到小执行。
- 当包含子查询的时候。先执行子查询,所以id值最大。
select_type:
表示查询中每个select字句的类型,常用种类有:
类型 | 含义 |
---|---|
Simple | 查询中不包含子查询或者union |
Primary | 查询中若包含任何复杂的子部分,最外层查询被标记为Primary |
subquery | 在select或where列表中包含了子查询,该子查询被标记为subquery |
Derived | 在from列表中包含的子查询,被标记为Derived |
union | 若第二个select出现在union后,则被标记为union |
union result | 从union表获取结果的select被标记为union result |
table:
表名称
type:
表示mysql在表中找到所需行的方式,常见有:
- ALL:mysql进行全表扫描,性能最差
- index:全表扫描,但是只遍历索引树
- range:对索引的扫描开始于某一点,返回匹配值,常见于between,>,<的查询
- ref:非唯一性索引扫描,返回匹配某个单独值的所有行,使用非唯一索引或唯一索引的非唯一前缀进行的查询
- eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引值
- const:表最多只有一行匹配,用于主键或者唯一索引;const扫描的条件为:
- 1、命中主键(primary key)或者唯一(unique)索引
- 2、被连接的部分是一个常量(const)值
- system:表只有一行
- fulltext:全文搜索
- ref_or_null:与ref类似,但包括null
- index_merge:出现了索引合并优化(包括交集,并集以及交集之间的并集)
- unique_subquery:在in查询三种
各扫描类型的特点:
扫描类型 | 特点 |
---|---|
system | 最快,不进行磁盘I/O操作 |
const | 主键或者unique上面,是等值查找 |
eq_ref | 主键或者unique上的join查询,等值匹配,对于前表的扫描每一行,后表只有一行被命中 |
ref | 非唯一索引,等值匹配,可能对多行被命中 |
range | 索引上的范围查找,in,between |
index | 索引上的全部扫描,innodb的count |
all | 最慢,按表扫描 |
possible_keys:
显示查询可能使用那些索引来查找
- explain查看执行计划,可能出现possible_keys有列,而key显示null的情况,这种情况是因为表中数据不多,mysql认为索引对这个查询帮助不大,选择了全表扫描
- 如果possible_keys列为null,则没有相关的索引,这种情况,可以通过检查where字句看是否可以创建一个适当的索引来提高查询性能
key:
显示mysql采用那个索引来优化对该表的访问
如果没有使用索引,该列为null,想强制mysql使用或忽略possible_keys列中的索引,在查询中使用force idnex
key_len:
显示了mysql在索引里使用的字节数,通过整个值可以算出具体使用了索引中的那些列
ref:
显示了在key列记录的索引中,表查找所用到的列或常量,常见的有:const(常量),id(字段名)
rows
mysql要扫描多少行数据,才能找到你要的数据
Extra额外的信息
- Using index:使用覆盖索引
- Using where:使用where语句来处理,并且查询的列没有被所有覆盖
- user index condition:查询的列不完全被所有覆盖,where条件中是一个查询的范围
- using temporary:mysql需要创建一张临时表来处理查询
- using filesort:将用外部排序而不是索引排序,数据较小的时候从内部排序,否则需要在磁盘完成排序
- Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些