Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >是什么影响了数据库索引选型?

是什么影响了数据库索引选型?

作者头像
撸码那些事
发布于 2018-08-20 06:52:21
发布于 2018-08-20 06:52:21
3500
举报
文章被收录于专栏:撸码那些事撸码那些事

上一篇文章我们介绍了索引背后的数据结构,这篇文章我们来介绍影响索引数据结构选型的因素——存储器存取。

主存存取原理

主存的构成

主存储器(简称主存或内存)包括存取体、各种逻辑部件及控制电路等。存储体由许多存储单元组成,每个存储单元又包含若干个存储元件,每个存储元件能寄存一位二进制代码“0”或“1”。这样,一个存储单元可以存储一串二进制代码,这串二进制代码称为存储字,这串二进制代码的位数称为存储字长,可以是8位、16位或者32位等。

主存与CPU的联系

画外音:

MAR(Memory Address Register)是存储器地址寄存器,用来存放欲访问的存储单元的地址,其位数对应存储单元的个数(若MAR为10位,则有210=1024个存储单元,记为1k)。

MDR(Memory Data Register)是存储器数据寄存器,用于存放从存储体某单元取出的代码或准备往某存储单元存入的代码,其位数与存储字长相等。

现代计算机一般将MAR和MDR集成在CPU芯片中。

主存的存取过程

如果把存储体看做是一栋大楼,那么每个存储单元可以看成这栋大楼里的每个房间,每个存储元可以看做房间里的一张床位,床位有人相当于“1”,无人相当于“0”。每个房间都需要一个房间号,便于我们找到房间的位置。同样,可以赋予每个存储单元一个编号,称为存储单元的地址号

主存的工作方式就是按照存储单元的地址号来实现对存储字各位的存(写入)、取(读出)。

现代主存的结构和存取原理比较复杂,这里抛却具体差别,抽象出一个十分简单的存取模型来说明主存的工作原理。

主存的存取过程如下:

当系统需要读取主存时,首先由CPU将该字的地址送到MAR,经地址总线送至主存,然后发出读命令。主存接到读命令后,根据地址定位到指定存储单元,然后将此存储单元数据放到数据总线上,供其它部件读取。

写主存的过程类似,若要向主存存入一个信息字时,首先CPU将该字要存入的主存单元的地址经MAR送到地址总线,并将信息字送入MDR,然后向主存发出写命令,主存接到写命令后,便将数据总线上的信息写入到对应地址总线指出的主存单元中。

画外音:实际上主存存取的过程并没有这么简单,还需要经过经过地址译码(逻辑地址—>物理地址)等过程。

磁盘存取原理

我们知道,索引本身也很大,不可能全部存储在内存中(根节点常驻内存),一般以文件形式存储在磁盘上。那么问题来了,索引检索需要磁盘I/O操作。与内存不同,磁盘I/O存在机械运动耗费,相对于内存存取,I/O存取的消耗要高几个数量级。

磁盘的构成

磁盘的整体结构示意图:

一个磁盘由大小相同且同轴的圆形盘片组成,磁盘可以转动(各个磁盘必须同步转动)。在磁盘的一侧有磁头支架,磁头支架固定了一组磁头,每个磁头负责存取一个磁盘的内容。磁头不能转动,但是可以沿磁盘半径方向运动(实际是斜切向运动),每个磁头同一时刻也必须是同轴的,即从正上方向下看,所有磁头任何时候都是重叠的。

磁盘盘片示意图:

盘片被划分成一系列同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的磁道组成一个柱面。磁道被沿半径线划分成一个个小的段,每个段叫做一个扇区,每个扇区是磁盘的最小存储单元。

磁盘的存取过程:

当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。

为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点:

  1. 首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间
  2. 然后目标扇区旋转到磁头下,即磁盘旋转将目标扇区旋转到磁头下。这个过程耗费的时间叫做旋转时间

所以一次访盘请求(读/写)完成过程由三个动作组成:

  1. 寻道(时间):磁头移动定位到指定磁道
  2. 旋转延迟(时间):等待指定扇区从磁头下旋转经过
  3. 数据传输(时间):数据在磁盘与内存之间的实际传输

局部性原理与磁盘预读

由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百万分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:

局部性原理: CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。 空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的。

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率

预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页的大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

数据库为什么选用B-/+Tree索引

之前提到过,SQL优化的一个重要原则是减少磁盘I/O次数,磁盘I/O次数也是评价索引结构的优劣的指标之一。

B-Tree分析:

根据B-Tree的定义,可知检索一次最多需要访问h(B-Tree的高度)个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。但是逻辑上存储在一个页里并不代表物理上也存储在一个页里,为了达到这个目的,每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个节点只需一次I/O。

B-Tree中一次检索最多需要h-1次I/O,因为根节点会常驻内存。复杂度为O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。所以B-Tree作为索引结构效率是非常高的。这也是为什么数据库不选用红黑树作为索引(数据结构)的原因,一是因为红黑树的高度h要大的多;二是红黑树节点在物理上可能是单独存储的,无法利用局部性原理。复杂度为O(h),效率明显比B-Tree差的多。

B+Tree分析:

上篇文章说过,B+Tree更适合索引。究其原因,一是因为B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能;二是因为所有叶子节点形成有序链表,便于范围查询;所有的查找最终都会到叶子节点,从而保证了查询性能的稳定

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 撸码那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
索引的数据结构及算法原理--为什么使用B-Tree
上文说过,红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B-/+Tree作为索引结构,这一节将结合计算机组成原理相关知识讨论B-/+Tree作为索引的理论基础。
陈不成i
2021/06/08
3240
MySQL 索引的底层逻辑
索引的本质其实就是一种数据结构。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找,这种复杂度为 O(n) 的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找、二叉树查找等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
政采云前端团队
2024/01/03
9690
MySQL 索引的底层逻辑
MySQL索引底层实现原理 & MyISAM非聚簇索引 vs. InnoDB聚簇索引
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
一个会写诗的程序员
2019/10/28
1.4K0
MySQL索引底层实现原理 & MyISAM非聚簇索引 vs. InnoDB聚簇索引
MySQL索引背后的数据结构及算法原理
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
互扯程序
2019/07/30
4890
MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为三个部分。 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。 第二部分结合MySQL数据库中MyISAM和
用户1263954
2018/06/22
1.2K0
【软考学习6】计算机存储结构——局部性原理、Cache、主存地址单元、磁盘存取、总线和可靠性
计算机的存储机构包括了 CPU 的 寄存器,用于临时缓存指令数据,还有 高速缓存 Cache、内存 和 外存,如下图所示。
Designer 小郑
2023/08/01
6260
【软考学习6】计算机存储结构——局部性原理、Cache、主存地址单元、磁盘存取、总线和可靠性
《面试官:谈谈你对索引的认知》系列之磁盘I/O
前面两讲我们介绍了B-/+树的特性对比,数据库系统普遍采用B-/+树作为索引结构。
架构精进之路
2021/07/12
5520
《面试官:谈谈你对索引的认知》系列之磁盘I/O
MySQL索引背后的数据结构及算法原理
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。
叫你不戴帽子
2018/06/03
2K0
MySQL索引背后的数据结构及算法原理
MySQL的B+tree索引实现原理
官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构,即索引是数据结构。 其出现就是为了提高数据查询效率,就像书的目录。
JavaEdge
2021/02/22
6240
MySQL的B+tree索引实现原理
算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树。2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key。
yaphetsfang
2020/07/30
4080
算法和数据结构: 十 平衡查找树之B树
数据结构技术知识总结之二——BTree
B-Tree 是 2-3 树的一种变形,可以设置度数 M,每个节点上最多可以有 M 个值;根据硬盘读取时的预读原理,磁盘读取时每次从磁盘上预读 page 容量(一般为 1024 字节)的整数倍,所以对于硬盘来说,可以将度设为 1024,这样就硬盘文件的索引就建立完毕,形成了一个 B-Tree 结构;
剑影啸清寒
2020/07/15
7380
mysql学习之优化总结(2)--索引的那些事
上一篇文章我们在研究MySQL查询过程的查询优化步骤中提到过优化索引可以优化查询优化的过程,索引到底是什么?它在查询过程中是一个怎样的角色?索引适用于什么场景?我们怎么用好它呢,这一节我们一起来深入了解下索引,理解索引相关的数据结构和算法,理解它的原理,帮助我们更好的使用索引。
王辅佳
2018/10/27
7550
数据库索引(结合B-树和B+树)
数据库索引,是数据库管理系统中一个排序的数据结构以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种
Mister24
2018/05/14
9380
终于知道为什么片子太多会导致硬盘变慢了
硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-160就是基于SCSI-3标准的;IDE 遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SATA是串口,SATA的发展目的是替换IDE;
架构师修行之路
2021/06/09
1.6K0
终于知道为什么片子太多会导致硬盘变慢了
微信大牛教你深入了解数据库索引
| 作者 刘国斌,腾讯微信事业群研发工程师,目前从事企业微信的后台研发工作,已经参与企业微信消息系统、群聊、客户联系等企业微信多个核心功能的迭代。 ---- 数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。 最基本的查询算法当然是顺序查找(linear search),然而这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(
腾讯云数据库 TencentDB
2020/08/11
6920
MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎 对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索 引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到
wangxl
2018/03/08
1.2K0
MySQL索引背后的数据结构及算法原理
MySQL索引及其实现原理(基于MyISAM及InnoDB引擎)
查询是数据库的最主要功能之一。我们都希望查询速度能尽可能快,因此数据库系统的设计者会从查询算法角度优化
JavaEdge
2018/05/16
21.1K2
MySQL索引及其实现原理(基于MyISAM及InnoDB引擎)
数据库索引
索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
Kevin_Zhang
2018/09/20
1K0
数据库索引
数据库索引原理及优化
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。
Bug开发工程师
2019/05/05
6060
数据库索引原理及优化
面试官:MySQL 存储数据过多,为啥会变慢?
目前大部分数据库系统及文件系统都采用BTree或其变种B+Tree作为索引结构,mysql 快与慢与索引结构有较大关系。
王小明_HIT
2023/08/09
3520
面试官:MySQL 存储数据过多,为啥会变慢?
相关推荐
索引的数据结构及算法原理--为什么使用B-Tree
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档