当前位置: 首页 > article >正文

MySQL的覆盖索引

MySQL的覆盖索引

前言

当一个索引包含了查询所需的全部字段时,就可以提高查询效率,这样的索引又被称之为覆盖索引

以MySQL常见的三种存储引擎为例:InnoDBMyISAMMemory,对于覆盖索引提高查询效率的方式均不同,

下面让我们分别讲讲:

InnoDB

InnoDB中,主键索引的叶子节点存储完整的数据行,称为聚簇索引,而唯一索引普通索引联合索引的叶子节点只存储索引字段和主键值,称之为二级索引

当一条查询sql用到的索引只包含部分需要的字段时,就需要先在二级索引中查到相应数据的主键字段,然后根据主键字段在主键索引中查到全部数据。回到主键索引中查询数据,这个就叫做回表,因为一次索引查询还查不到全部数据,还需要回表一次才能查到全部数据。

但是,如果sql查询所需的字段全部包含在用到的索引中,就可以在二级索引中直接查询到所需的全部数据,不需要再回表了,这种包含所需的全部字段的索引,就叫做覆盖索引

InnoDB中,覆盖索引可以减少回表的次数,提高查询效率。

MyISAM

MyISAM中,索引保存的是数据值,以及指向数据在磁盘中位置的指针

当一条sql查询没有用到索引时,就需要直接到磁盘中的数据文件进行搜索。

当一条sql查询用到索引的部分字段时,会先在索引中查到部分字段的指针,然后再到磁盘中根据指针查询到对应行,再在行中查询全部所需数据。

但是,如果sql查询用到的索引包含全部所需的字段时,也就是用到覆盖索引时,就可以直接在索引中查到全部所需字段的值,不需要再进行磁盘IO。

MyISAM中,覆盖索引可以减少磁盘IO的次数,提高查询效率。

Memory

Memory中,与在MyISAM中逻辑相似,不过Memory是将数据存储在内存中,虽然内存IO磁盘IO快很多,但使用覆盖索引仍有利于减少内存IO,提高查询效率。

需要注意的是,本文并未特别考虑同时使用其它索引的情况,不使用覆盖索引而使用其它索引仍然可能达到同样的效果。


http://www.kler.cn/a/529834.html

相关文章:

  • 在Arm芯片苹果Mac系统上通过homebrew安装多版本mysql并解决各种报错,感谢deepseek帮助解决部分问题
  • MySQL不适合创建索引的11种情况
  • MySQL 存储函数:数据库的自定义函数
  • 深入剖析 HTML5 新特性:语义化标签和表单控件完全指南
  • (9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同
  • 从0开始,来看看怎么去linux排查Java程序故障
  • Games104——网络游戏的架构基础
  • Eigen::Tensor使用帮助
  • Qt常用控件 输入类控件
  • 文本复制兼容方案最佳实现落地。
  • Node.js常用知识
  • 在Qt中,slots 关键字有什么用?
  • GIt使用笔记大全
  • 面经-C语言——指针相关概念总结
  • 1. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--引言
  • vue3-element-plus-admin 框架
  • 如何让跨域文件管控简单又高效
  • Hot100之贪心算法
  • 记录一下【Facebook 】expansionToken参数逆向
  • lstm代码解析1.1
  • Ubuntu 下 nginx-1.24.0 源码分析 main函数 — ngx_cdecl 宏
  • kamailio-Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版)
  • 效用曲线的三个实例
  • c++井字棋(单人对电脑:1.电脑随机下 2.电脑AI;3.双人对决)
  • Python Web框架比较:Flask与FastAPI的特性和应用场景
  • Mask R-CNN与YOLOv8的区别