索引覆盖

索引覆盖索引覆盖如果查询的列恰好是索引的一部分 那么查询只需要在索引文件上进行 不需要回行到磁盘再找数据 这种查询速度非常快 称为 索引覆盖 假设有一张 t15 表 在表中建立了一个联合索引 cp cat id price 当我们使用下面的 sql 语句 会出现索引覆盖的情况 不信我们可以来查看一下 这里的 Extra 中显示了 Usingindex 表示这条 sql 语句刚好用到了索引覆盖 selectpricef

索引覆盖

如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据。这种查询速度非常快,称为“索引覆盖”。

假设有一张t15表,在表中建立了一个联合索引:cp(cat_id,price)

这里写图片描述

当我们使用下面的sql语句,会出现索引覆盖的情况。不信我们可以来查看一下,这里的Extra中显示了Using index,表示这条sql语句刚好用到了索引覆盖。

这里写图片描述

select price from t15 where cat_id = 1;

在来看一题,创建一张t11表,在email列有一个索引

这里写图片描述

假设我们用这样的查询语句:

select eamil from t11 where right(email,4)='.com'

查询分析:

这里写图片描述

首先看一下Extra,这里有Using index,说明这里使用到了索引覆盖,而possible_keys为NULL的原因是因为,使用到了mysql中的函数,所以在查询的时候并没有使用到email索引,但是key却为email,表示了使用到了索引进行排序,不信我把数据打印看看。

这里写图片描述

这里的数据是经过排序的。原本的数据是这样的。

这里写图片描述

索引覆盖的问题

疑问: id, (id,ver)都有索引, select id 应该都产生”索引覆盖”的效果,为什么前者慢,而后快?

思路:innodb聚簇与myisam索引的不同 , 索引覆盖 这2个角度来考虑

(1)假设此表使用的是Myisam的索引,那么这两条sql语句都不需要回行查找数据,那么他们的速度应该差不多。

(2)假设此表使用的是InnoDB的索引,那么select id from A order by id这句sql使用到了主键索引,因为InnoDB的每个主键都挂载这每行的数据,并且本题中还有几个特别大的字段,所以会在查找id的时候需要走的相对慢;而select id from A order by id,ver这句sql使用到了id,ver联合索引,在InnoDB存储引擎中,次索引保存的是对主键索引的应用,所以次索引不挂载该行的数据,那么在(id,ver)索引中查找id会快,当找到对应的节点树时,只需要再次查找到主键索引的位置,即可拿到该行的数据,这样比较快。

推断:

t12表,存储引擎为MyISAM,有主键索引和(id,ver)符合索引,还有几个大的变长字段,测试推论1

这里写图片描述

t13表,存储引擎为InnoDB,有主键索引和(id,ver)符合索引,还有几个大的变长字段推论2

这里写图片描述

t14表,存储引擎为InnoDB,有主键索引和(id,ver)符合索引,没有几个大的变长字段推论3

这里写图片描述

t12,t13,t14每张表中都有1W条数据,然后进行测试,测试结果如下,我们的推论是正确的。

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177294.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:51
下一篇 2026年3月26日 下午7:51


相关推荐

  • Git 开发必备 .gitignore 详解!【建议收藏】

    Git 开发必备 .gitignore 详解!【建议收藏】作者 Linux 猿 简介 CSDN 博客专家 C C 面试 刷题 算法尽管咨询我 关注我 有问题私聊 关注专栏 Linux 优质好文持续更新中 在使用 git 管理项目过程中 gitignore 文件是必备的文件 下面来详细说一说 一 为什么使用 gitignore 在一些项目中 我们不想让本地仓库的所有文件都上传到远程仓库中 而是有选择的上传 比如 一些依赖文件 node modules 下的依赖 bin 目录下的文件 测试文件等

    2026年3月20日
    2
  • socketpair原理_socket负载均衡

    socketpair原理_socket负载均衡描述先看下传统的CS模型,如下:总是一方发起请求,等待另一方回应。当一次传输完成之后,client端发起新的请求之后,server端才作出回应。那如何才能做到双向通信? 一种解决办法就是client端即使client,又是server,server端即使client也是server,如下:但是上述方面比较复杂,这时候就引入要分析的socketpair了。

    2022年10月14日
    5
  • 兄弟连新版Linux视频教程

    兄弟连新版Linux视频教程兄弟连新版Linux视频教程目录:F:\linux\兄弟连新版Linux视频教程├(1)云计算是什么东西集群又是嘛玩意?.mp4├(2)兄弟连新版Linux教程1.1.1Linux系统简介-UNIX发展历史和发行版本.mp4├(3)兄弟连新版Linux教程1.1.2Linux系统简介-Linux发展历史和发行版本.mp4├(4)兄弟连新版Linux教程1.2Linux系统简介-开源软件…

    2022年6月10日
    36
  • java日志系统详解

    java日志系统详解本文转自 点击打开链接 Java 日志系统确实比较丰富 常用的有 log4j JUL logback 等等 同时伴随着日志系统的发展 出现了日志框架 commons logging 和 slf4j 简短地描述下日志发展 最先出现的是 apache 开源社区的 log4j 这个日志确实是应用最广泛的日志工具 成为了 java 日志的事实上的标准 然而 当时 Sun 公司在 jdk1 4 中增加了 JUL 日

    2026年3月17日
    2
  • SOAP协议简介[通俗易懂]

    SOAP协议简介[通俗易懂]SOAP 简介SOAP是基于XML的简易协议,可使应用程序在HTTP之上进行信息交换。或者更简单地说:SOAP是用于访问网络服务的协议。您应当具备的基础知识在继续学习之前,您需要对下面的知识有基本的了解:XMLXML命名空间如果您希望首先学习这些项目,请访问我们的《XML教程》。什么是SOAP?SOAP指简易对象访问协议SOAP是一种通信协议SOAP用于应用程序之间的通信S…

    2022年7月24日
    14
  • 单例模式singleton_单例模式例子

    单例模式singleton_单例模式例子单例模式 Singleton动机模式定义实例结构要点总结笔记动机在软件系统中,经常有一些特殊的类,必须保证它们在系统中只存在一个实例,才能保证他们的逻辑正确性、以及良好的效率如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?模式定义保证一个类仅有一个实例,并提供一个该实例的全局访问点。实例单例class Singleton{private : Singleton(); Singleton(const Singleton& other);public:

    2022年8月9日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号