• mysql-覆盖索引


    判断标准

    使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询

    注意

    • 1、覆盖索引也并不适用于任意的索引类型,索引必须存储列的值
    • 2、Hash 和full-text索引不存储值,因此MySQL只能使用B-TREE
    • 3、并且不同的存储引擎实现覆盖索引都是不同的
    • 4、并不是所有的存储引擎都支持它们
    • 5、如果要使用覆盖索引,一定要注意SELECT 列表值取出需要的列,不可以是SELECT *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降,不能为了利用覆盖索引而这么做

    InnoDB

    • 1、覆盖索引查询时除了除了索引本身的包含的列,还可以使用其默认的聚集索引列
    • 2、这跟INNOB的索引结构有关系,主索引是B+树索引存储,也即我们所说的数据行即索引,索引即数据
    • 3、对于INNODB的辅助索引,它的叶子节点存储的是索引值和指向主键索引的位置,然后需要通过主键在查询表的字段值,所以辅助索引存储了主键的值
    • 4、覆盖索引也可以用上INNODB 默认的聚集索引
    • 5、innodb引擎的所有储存了主键ID,事务ID,回滚指针,非主键ID,他的查询就会是非主键ID也可覆盖来取得主键ID

    覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不用读取数据有以下一些优点

    • 1、索引项通常比记录要小,所以MySQL访问更少的数据
    • 2、索引都按值的大小顺序存储,相对于随机访问记录,需要更少的I/O
    • 3、大多数据引擎能更好的缓存索引,比如MyISAM只缓存索引
    • 4、覆盖索引对于InnoDB表尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了

    mysql的存储引擎Myisam要比innodb查询速度快的原因是,这两者的数据存储方式不一样,myisan是顺序存储,而innodb聚簇索引,myisam的索引指针指向的直接就是数据的的屋里地址,而innodb的索引指向的是主键,所以需要进行二次查找(sql用到索引时将会是行锁,锁的粒度小),降低了查询的效率,因此innodb引入了索引覆盖技术,提高查找的效率

  • 相关阅读:
    leetcode| Intersection of Two Arrays II
    Spring Boot起步依赖:定制starter
    SpringBoot自动配置的魔法是怎么实现的
    Dubbo中的IoC实现
    必须知道的String知识点
    Dubbo的SPI机制
    为什么要设置HTTP timeout?
    重构代码——简单工厂模式+模板方法模式
    计算机基础——位运算
    系统间HTTP调用代码封装
  • 原文地址:https://www.cnblogs.com/Profound/p/8763022.html
Copyright © 2020-2023  润新知