zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    【IDEA】转大小写快速操作
    【WSDL】WebService描述语言的实践
    【WEB】URL文件
    【BatchProgram】工作用的小工具
    【Java】自制查找工具
    【DataBase】SQL优化问题
    【IDEA】DEBUG调试问题
    【DataBase】XueSQL Training
    【SVN】文件解锁
    【DataBase】SQL45 Training 45题训练
  • 原文地址:https://www.cnblogs.com/qcfeng/p/6133848.html
Copyright © 2011-2022 走看看