高性能MySQL索引教程1(执行计划)

1.如何查看执行计划
EXPLAIN SELECT
1
变体:
1)查看SQL执行效率
EXPLAIN EXTENDED SELECT
2)对分区进行调优
EXPLAIN PARTITIONS
2.执行计划详细说明
1)id
包含一组数字,表示查询中执行select子句或操作表的顺序
2
id相同,执行顺序由上至下
3
如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
4
id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
2)select_type
表示查询中每个select子句的类型(简单 OR复杂)
5
①SIMPLE:查询中不包含子查询或者UNION;
②PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记;
③SUBQUERY:在SELECT或WHERE列表中包含了子查询;
④DERIVED(衍生):在FROM中包含的子查询被标记为 ;
⑤UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;
⑥UNION RESULT:UNION表获取结果的SELECT;
3)type
表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:
6
ALL:全表扫描(Full Table Scan)
7
const:最多会有一条记录匹配。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次。发生在有一个unique key或者主键,并且where子句给它设定了一个比较值。
SELECT * FROM `titles` a WHERE a.`emp_no` = 1 AND a.`title` = '22' AND a.`time` = '11'
index:索引扫描(Full Index Scan)
8
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>、like等的查询
9
10
range访问类型的不同形式的索引访问性能差异
11
ref:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找(使用索引的部分前缀进行搜索)
12
13
14
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描(在routes_agency表中的relay_product_id是主键,routes_agency_detail 表中的relay_product_id也是主键,该表可以认为是订单表的补充信息表,他们的关系是1对1,在下面的例子中可以看到b表的连接类型是eq_ref)
15
ref_or_null
user_id字段是一个可以为空的字段,并对该字段创建了一个索引。mysql为含有null的字段专门做的处理。在我们的表设计中应当尽量避免索引字段为NULL,因为这会额外的耗费mysql的处理时间来做优化。
explain select * from t_order where user_id=100 or user_id is null
16
4)其他
possible_keys:可以被使用的索引
key:实际使用的索引
key_len:表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段都被查询用到
ref:显示了哪些字段或者常量被用来和 key配合从表中查询记录出来。[const表常量]
rows:MySQL认为它执行查询时必须检查的行数
extra:
using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错!
using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using where这么一个说明。
using temporary:这意味着mysql对查询结果进行排序的时候使用了一张临时表。
using filesort:这个说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。