骄傲的赛亚人

mysql性能优化器explain

explain作用:

使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈。

通过explain可以得到以下信息:
  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

语法:

explain + sql语句

image

主要字段包括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调大一些

posted on 2022-03-02 14:55  骄傲的赛亚人  阅读(66)  评论(0编辑  收藏  举报

导航