• 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。

  • 相关阅读:
    你不知道的正则表达式
    浅谈apache网页优化及方法
    Web基础与HTTP协议
    nfs
    Vi编辑器的工作模式
    磁盘管理和磁盘配额
    系统安全及应用
    正则表达式与文本编辑器
    读书笔记_java设计模式深入研究 第三章 工厂模式 Factory
    JavaScript模式读书笔记 第7章 设计模式
  • 原文地址:https://www.cnblogs.com/qcfeng/p/6133848.html
Copyright © 2020-2023  润新知