如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
只扫描索引而无需回表的优点:
1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引。

当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息

覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段,但不是整个查询涉及的字段,mysql5.5和之前的版本也会回表获取数据行,尽管并不需要这一行且最终会被过滤掉。

如上图则无法使用覆盖查询,原因:
1.没有任何索引能够覆盖这个索引。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。

2.mysql不能在索引中执行LIke操作。mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。这种情况下mysql只能提取数据行的值而不是索引值来做比较

优化后SQL:添加索引(artist,title,prod_id),使用了延迟关联(延迟了对列的访问)

说明:在查询的第一阶段可以使用覆盖索引,在from子句中的子查询找到匹配的prod_id,然后根据prod_id值在外层查询匹配获取需要的所有值。

5.5时API设计不允许mysql将过滤条件传到存储引擎层(是把数据从存储引擎拉到服务器层,在根据条件过滤),5.6之后由于ICP这个特性改善了查询执行方式

mysql覆盖索引详解相关推荐

  1. mysql 联合索引详解

    mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...

  2. Mysql之索引详解

    索引 1.索引的本质 2.索引的优势和劣势 优势 劣势 3.MySQL的索引类别 1.Btree 索引 2.B+tree 索引 3.B+Tree 与 B-Tree 的区别 3.1B+Tree的优势 4 ...

  3. MySQL聚集索引详解_MySQL innodb 聚集索引的概念与使用教程

    聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同.一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个. 在MySQL中,InnoDB引擎表是( ...

  4. Mysql数据库索引详解

    一.前言 随着我们业务量不断的增大,会发现查询数据库的时间变的越来越长,其实就是数据库到达了性能的瓶颈,这时候需要我们对其进行优化操作,可能我们第一时间就会想到:加索引.没错,这是优化的一个方向,但是 ...

  5. mysql 复合索引详解

    联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...

  6. JAVA中Explain注解用法,mysql之explain详解(分析索引最佳使用)

    mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...

  7. mysql之explain详解(分析索引最佳使用)

    mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...

  8. MySQL字符串前缀索引详解

    MySQL字符串前缀索引详解 1. 前缀索引与全部索引概念 2. 前缀索引与全部索引数据结构 3. 前缀索引与全部索引引执行流程 4. 前缀索引长度如何取舍 5. 前缀索引对覆盖索引的影响 6. 其他 ...

  9. MYSQL performance schema详解

    MYSQL performance schema详解 0.performance_schema的介绍 ​ MySQL的performance schema 用于监控MySQL server在一个较低级 ...

最新文章

  1. python中typing.NamedTuple示例
  2. 增加CentOS File Descriptors
  3. MapXtreme 安装、编码及打包注意事项
  4. 微软NNI---AutoFeatureENG
  5. 从shiro源码角度学习工厂方法设计模式
  6. 无状态Spring安全性第2部分:无状态身份验证
  7. 【360开源】Wayne:企业级可视化多集群Kubernetes一站式管理平台
  8. 吴恩达神经网络和深度学习-学习笔记-26-迁移学习(transfer learning)
  9. LINUX下的LVM逻辑卷管理器
  10. 最全iOS数据存储方法介绍:FMDB,SQLite3 ,Core Data,Plist,Preference偏好设置,NSKeyedArchiver归档...
  11. 死磕java并发系列
  12. matlab dynprog,matlab信号处理工具箱
  13. 避免踩坑,数据库主键字段不能为空
  14. 拼多多开店怎么做推广?四川万顿思
  15. Movavi Video Editor 15 Plus for mac(视频编辑软件)
  16. 300以内的蓝牙耳机哪款好?半入耳蓝牙耳机南卡和漫步者测评
  17. WOFOST模型Matlab,一种WOFOST-PAR耦合模型建立方法与流程
  18. matlab和eigen在旋转向量,欧拉角,四元数,旋转矩阵转换的对比(一 旋转矩阵转其他)
  19. 一种低成本的室内定位UWB技术方案
  20. 计算机专业必备电脑软件,你们的电脑桌面都有哪些必备的办公软件?

热门文章

  1. 研究生平均签约年薪 18.91 万,上海交大2019年就业质量报告发布
  2. IIS URL重写实现重定向
  3. VB.NET 操作excel出现的{000208D5-0000-0000-C000-000000000046}错误
  4. 抖音电商助力广东荔枝产业走向快车道
  5. MindNode 5 for Mac(思维导图软件)中文版
  6. redis读写分离 java_spring-data-redis读写分离
  7. linux重命名得通配符,在Linux中如何一次重命名多个文件详解
  8. Arrays.asList()注意事项
  9. 用SPSS做时间序列
  10. python如何创建二维数组