1205索引使用explain

-- 转自博客http://blog.sina.com.cn/s/blog_75a2f94f0101ddhb.html
01type类型
type按照从最佳类型到最坏类型进行排序,该字段和ref字段相结合使用
system 表仅有一行(=系统表)。这是const联接类型的一个特例。
const 用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时 SELECT * from tbl_name WHERE primary_key=1;
eq_ref 对于每个来自于前面的表的行组合,从该表中读取一行。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;-- 嵌套查询的时候,内存查询每次获取唯一一条记录
ref对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY
(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。嵌套查询多个条件的话 那么为ref
range只检索给定范围的行,使用一个索引来选择行。
index 利用索引,按索引顺序去扫描,随机IO变成了顺序IO,
含义仅仅是局限在扫描全表的顺序是按照索引顺序扫描的,仅仅是按索引顺序去扫描的。它的有点是避免了排序,因为索引就是已经排序好的,缺点就是要承担按照索引次序读取整张表的开销。
all 全表扫描 不使用索引,All 这个就是所谓的全表扫描,没有用到任何的index,mysql就是从头到尾把整个表遍历一边,找到所需要的数据行。

02主键索引和二级索引
使用主键获取速度比使用二级索引获取数据的速度更慢?
因为是BTREE,那么数据是存储在索引的叶子节点,你既然选择所有的话,那么都要跑一遍 索引有几个长字段 所以慢;
反而二级索引不存在存放真实数据,只存放主键ID和自己ID,所以速度明显快了
所以为什么要建立联合索引 idex_union(id,ref_id) 又是二级索引,又是组合索引这样不用去找主键,但是数据又是分散的

03
-- 同样一个SQL语句获取的范围不一样,对应的执行方式不一样
EXPLAIN
SELECT * FROM tbname WHERE id BETWEEN 10 AND 500000-- 数据量太大:直接回表查询,没有必要使用索引

EXPLAIN
SELECT * FROM tbname WHERE id BETWEEN 10 AND 10000-- 数据量一般:先使用INDEX索引覆盖,然后使用MRR,将随机IO转化为顺序IO。MySQL5.6中引入了MRR

EXPLAIN
SELECT * FROM tbname WHERE id BETWEEN 10 AND 100-- 数据量很小:直接INDEX索引覆盖,然后通过随机IO回行找数据
-- MySQL5.6中引入了MRR,专门来优化:二级索引的范围扫描并且需要回表的情况。
-- 它的原理是,将多个需要回表的二级索引根据主键进行排序,然后一起回表,将原来的回表时进行的随机IO,转变成顺序IO。

原文地址:https://www.cnblogs.com/qcfeng/p/6133848.html