做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)

  MYSQL的INNODB存储引擎的索引是遵循最左匹配规则的,索引的优劣有你的SQL有直接的关系,一个好的SQL和一个好的索引,MYSQL单表都可以支持5000w~8000w左右的数据,平时开发的过程中可以用关键字Explain关键字解释你的SQL执行计划:

explain select * from user where id = 3

执行计划中显示有:

  id:  表示sql的执行顺序

  select_type:常见的有下面这2种

                           ①simple:表示该SQL没有联合查询和子查询

                          ②primary:表示该SQL是一个联合查询,该执行计划是最外层sql的解释执行计划

    做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)_第1张图片                     

  table:表示该SQL执行所用到的表

  type:这个是很重要的参数,表示了该SQL是否用到了合适的SQL或者说是优质的多表链接,官方的解释是这样的:(红色为翻译字体)

 

    explain输出的type列所描述的是多表之间查询的时候是怎么关联的,下面是列出的几种关联关系,从好到坏依次排列:

     system类型:当表中只有一条数据的时候,会出现,这只是个const关联关系的特例

做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)_第2张图片

const:当table中最多有一条数据匹配的时候,并且在查询语句中首先被读取,因为只有一行匹配,所以该行会被优化器认为是一种常量表,常量表很快,因为执行sql只需要读取一次

  const会被用到,当你使用主键或者唯一索引去匹配的时候,例如下面的查询例子,tb1_name会被优化器当做常量表

eq_ref类型表示:当关联的某表只有一行与其他的表每一行表一一做匹配的时候,除了system和const类型外,eq_ref最好的关联的关系,它被用于当一个索引(该索引是主键索引或者是唯一不为空的索引)的全部部分去与其他表关联的时候

eq_ref可以用作索引列用“=”操作符连接的时候,匹配相比较的值可以被认为是一种常量或者是一个表达式来与其他被读取的表列相匹配,下面的例子可以mysql可以用eq_ref关联来处理关联表

(简而言之,就是2表关联的时候,是使用主键索引或者非空的唯一索引去连接的,两表的笛卡尔集是 1*N的关系)

做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)_第3张图片

ref表示匹配的索引列的行数不止一行,匹配的每一行都需要与其他的表每一行逐一做匹配,ref表示关联两张表的索引并不是主键索引也不是唯一索引,而是只是用到了普通索引的最多的最左部分,换句话说,如果索引列能过滤大部分的行,过滤后的某表只有几行与其他表的某列逐一匹配的时候也是不错的关联

(简而言之,就是两张表关联的时候,关联的列设置了索引,但是该列的索引不是主键索引,也不是唯一索引,笛卡尔集是M*N的关系,如果M很小的时候,此关联的性能也很好)

fulltext 关联的时候用到了全文索引



ref or null 这个与ref很像,只是与ref不同的地方是匹配列可能是null

(官方说ref好于ref or null 这说明如果你创建表的时候,某列是null然后再对该列加索引的时候,进行两张表关联的时候,会产生ref or null的关联关系,会影响性能,所以大在设计表的时候,尽量给某列都设置NOT NULL然后给一个默认值,这样会优化索引)

做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)_第4张图片

index merge 索引合并表示索引合并优化被用到了,在输出的行中所有列包含了不止一个的索引,mysql会去优化索引,合并索引,以致用到更长的索引

索引合并时被用在获取几个范围查询的行数并且把合并的结果合并成一条,这个合并可以产生联合,交叉点,需要注意的是合并索引只能局限于单表的多个索引合并优化,不能作用于多表的索引合并

(根据官网给出的例子显示包含单表的OR匹配,且or匹配的列必须有索引,或者是单表的索引列范围查询)

做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)_第5张图片

unique_subquery:(看名字就知道,子查询覆盖了唯一索引或者主键索引)

index_subquery:(子查询覆盖了索引)

做一个合格的程序猿之MYSQLSQL的EXPLAIN使用(四)_第6张图片

range表示使用一个索引去获取几行数据,key表示那个索引被用到了,key_len包含了被用到的索引的最大长度是多少(最左匹配),并且关联的列可以使空

range查询可以用于下面的几个操作符 =,<,>BETWEEN IN IS 等,说明索引不止可以用于“=”匹配

(range匹配是我们平时sql中单表最常见的,此时说明了你写的sql还不错,不过你要思考是否可以接着优化你的sql,或者索引,来增加匹配索引的长度或者匹配的类型,能不能变成eq_ref等之类更加优秀的)

all表示全表扫描匹配,这说明你应该优化你的索引,或者应该说建立有效的索引了,这是最差的匹配方式

  possible_keys:可能用到的索引的名称

  key:用到的索引

  key_len:用到索引的长度

  ref:显示索引的哪一列被使用了,索引可能是多列索引,如果可能的话,是一个常数

  row:实际可能要扫描的行数(越小越好)

  Extra:

需要注意的是当Extra显示:using filesortusing temporary 这说明了你的查询sql是极差的,用到了查询后的排序和查询临时表,需要优化。

你可能感兴趣的:(mysql,EXPLAIN,type解释,explain解释)