mysql覆盖索引详解
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
只扫描索引而无需回表的优点:
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覆盖索引详解相关推荐
- mysql 联合索引详解
mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...
- Mysql之索引详解
索引 1.索引的本质 2.索引的优势和劣势 优势 劣势 3.MySQL的索引类别 1.Btree 索引 2.B+tree 索引 3.B+Tree 与 B-Tree 的区别 3.1B+Tree的优势 4 ...
- MySQL聚集索引详解_MySQL innodb 聚集索引的概念与使用教程
聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同.一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个. 在MySQL中,InnoDB引擎表是( ...
- Mysql数据库索引详解
一.前言 随着我们业务量不断的增大,会发现查询数据库的时间变的越来越长,其实就是数据库到达了性能的瓶颈,这时候需要我们对其进行优化操作,可能我们第一时间就会想到:加索引.没错,这是优化的一个方向,但是 ...
- mysql 复合索引详解
联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...
- JAVA中Explain注解用法,mysql之explain详解(分析索引最佳使用)
mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...
- mysql之explain详解(分析索引最佳使用)
mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...
- MySQL字符串前缀索引详解
MySQL字符串前缀索引详解 1. 前缀索引与全部索引概念 2. 前缀索引与全部索引数据结构 3. 前缀索引与全部索引引执行流程 4. 前缀索引长度如何取舍 5. 前缀索引对覆盖索引的影响 6. 其他 ...
- MYSQL performance schema详解
MYSQL performance schema详解 0.performance_schema的介绍 MySQL的performance schema 用于监控MySQL server在一个较低级 ...
最新文章
- python中typing.NamedTuple示例
- 增加CentOS File Descriptors
- MapXtreme 安装、编码及打包注意事项
- 微软NNI---AutoFeatureENG
- 从shiro源码角度学习工厂方法设计模式
- 无状态Spring安全性第2部分:无状态身份验证
- 【360开源】Wayne:企业级可视化多集群Kubernetes一站式管理平台
- 吴恩达神经网络和深度学习-学习笔记-26-迁移学习(transfer learning)
- LINUX下的LVM逻辑卷管理器
- 最全iOS数据存储方法介绍:FMDB,SQLite3 ,Core Data,Plist,Preference偏好设置,NSKeyedArchiver归档...
- 死磕java并发系列
- matlab dynprog,matlab信号处理工具箱
- 避免踩坑,数据库主键字段不能为空
- 拼多多开店怎么做推广?四川万顿思
- Movavi Video Editor 15 Plus for mac(视频编辑软件)
- 300以内的蓝牙耳机哪款好?半入耳蓝牙耳机南卡和漫步者测评
- WOFOST模型Matlab,一种WOFOST-PAR耦合模型建立方法与流程
- matlab和eigen在旋转向量,欧拉角,四元数,旋转矩阵转换的对比(一 旋转矩阵转其他)
- 一种低成本的室内定位UWB技术方案
- 计算机专业必备电脑软件,你们的电脑桌面都有哪些必备的办公软件?
热门文章
- 研究生平均签约年薪 18.91 万,上海交大2019年就业质量报告发布
- IIS URL重写实现重定向
- VB.NET 操作excel出现的{000208D5-0000-0000-C000-000000000046}错误
- 抖音电商助力广东荔枝产业走向快车道
- MindNode 5 for Mac(思维导图软件)中文版
- redis读写分离 java_spring-data-redis读写分离
- linux重命名得通配符,在Linux中如何一次重命名多个文件详解
- Arrays.asList()注意事项
- 用SPSS做时间序列
- python如何创建二维数组