从磁盘结构到数据库索引

磁盘结构

按照顺时针方向,一个盘片由很多section组成,编号0-N。从里向外分,又由多个track组成,编号0-N,sectiontrack交叉的地方叫做block,所以一个block可以由sectiontrack来定位。每一个block的大小是一样的。

操作系统读取数据都是按照block为单位进行。

block内,数据的存储结构可以看成一个一维数组,大致结构是这样(假设一个blocksize512byte)

Disk的读写头可以旋转和伸缩来定位一个block

为了使磁盘中的数据可以被应用程序使用,必须先copy数据到随机读写存储器RAM中,而这正是耗时的操作。

磁盘如何存储数据库数据

假设现在有一个Employee表,其中有一些字段,如下所示,所以一行数据的大小是128byte

假设总共有100行这样的数据

所以每一个block可以存储4行这样的数据,这100行数据需要25个block,假设现在按照这样的方式来查询一条记录,最多需要查找25个block.

那索引为什么可以减少查找的次数呢?

什么是索引

我们建一个简单的索引,有两个字段,一个eid,表示employeeid,还有一个字段pointer,指向数据存储在disk上的位置。empolyee中的每一行,在index上都有一条记录

当然我们也需要考虑如何存储这个索引表。如果索引存放在disk上,那么这个索引需要占据多少个block呢?eid大小为10bytespointer大小为6bytes,所以一行索引就有16个bytes大小。100条索引就需要占据100 * 16 / 512,也就是 4个block

在现在的情况下,我们查找employee表中的一条数据,最多就只需要4次索引表查找和一次employee表读取,相比没有索引的情况效率提升了很多

多级索引

如果现在把employee表中的数据行数增加到1000行,那么同理,数据表需要250个block,索引表需要40个block,现在查询一条记录就最多需要41次block的读取和拷贝(IO)

根据建立索引可以减少查找次数的理论,我们现在可以建立二级索引,也就是对上面的一级索引再建立索引,二级索引存储一级索引所在的block,现在一级索引占用40个block,所以二级索引表有40条记录,每一个索引记录大小为16byte,所以二级索引占用的block40*16/512,也就是2个block。那么现在再来根据二级索引查找到一级索引所在的block,再根据一级索引直接定位到employee表中的某条数据所在的block,最多一共需要2+1+1=4次查找(IO),相比之前效率又提升了不少。

随着数据表中数据记录的增加,可以建立三级,四级....索引来减少IO次数

多路(n-way)搜索树

二叉搜索树

每个节点只有一个值,一个节点最多两个子节点,左子节点比父节点小,右子节点比父节点大

一颗树代表了某一级索引,搜索树的高度(深度)代表了最多IO的次数,所以减少树的高度可以减少IO的次数

思路就是一个节点存储多个值,相应的子节点最大个数也可以有多个

n-way搜索树

由二叉搜索树扩展,让每个节点最多可以存n-1个索引值,每个节点可以有n个子节点,就是n-way搜索树

上面就是一个3路搜索树

我们可以使用这样的数据结构来作为索引,但是n-way搜索树也存在一些问题

比如现在有三个数据:10,20,30,要用一个10-way搜索树来构建。很有可能,最终会构建出一个这样的树

这是一种最坏的情况,相当于退化成链表结构。

B树:多路搜索树上增加限制

B树,实际上可以看作是n-way搜索树 + 规则(如何构建这棵树的规则)

规则:

  • 每个节点至少有[n/2]个子节点
  • 根节点可以最少有2个子节点
  • 所有的叶子节点必须在一个层级
  • 创建过程是由下往上的

值:10,20,40,50。要构建一个4-way搜索树。4-way搜索树,意味着一个节点最多可以有3个值。

继续插入操作,最后形成的结果是:

每一个节点可以有多个值,每个值里面包含一个键和位置指针,键用来作为标识,数据值标识数据存放的位置

B+树

B+树中,不是每个值旁边都有一个指向数据存储位置的指针,只有叶子节点才有。非叶子节点的值,在叶子节点上有他的副本

原文地址:https://www.cnblogs.com/watertreestar/p/11780301.html

时间: 2024-12-17 02:53:17

从磁盘结构到数据库索引的相关文章

B树在数据库索引中的应用剖析(转载)

引言 关于数据库索引,随便Google一个Oracle index,Mysql index总有大量的结果出来,其中不乏某某索引之n条经典建议.笔者认为,较之借鉴,在搞清楚了自己的需求的基础上,对备选方案的原理有个尽可能深入全面的了解会更有利于我们的选择和决策.因为某种方案或者技术呈现出某种优势(包括可能没有被介绍到但一定存在的限制),不是定义出来的,而是因为其实现机制决定的.就像LinkedList和ArrayList分别适用于什么应用不是Document里面定义的,是由其本身的结构决定的.数据

数据库索引 index介绍 sql索引存储结构

定义: 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 例如这样一个查询:select * from table1 where id=10000.如果没有索引, 必须遍历整个表,直到ID等于10000的这一行被找到为止:有了索引之后(必须是在ID这一列上建立的索引),在索引中查找,(例如二分法查找,很快就 能定位10000在索引表中的位置,如果索引存储的是id和该id对应的地址,那就直接指向该地址获取相应的数据)但索引是经过某种算法优化过的,查找次

数据库 索引

1.索引定义 百科:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 分析:索引是一种排序的结构:它需要对数据项建立索引并存储在物理空间中. 不同的索引类型和数据库,索引的建立和索引的查找机制会有所不同. 索引的作用就是加快查找的速度. 同时,由于在插入数据.修改数据时会创建索引或修改索引,因此会消耗数据库的性能和存储空间. 2.索引的分类 2.1 聚簇索引(clustered index) 2.1.1 创建聚簇索引 create clustered

数据库索引总结

一.为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能. 第一,   通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,   可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三,   可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义. 第四,   在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间. 第五,   通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能. 二.建立方向索引的不利因

深入浅出数据库索引原理

前段时间,公司一个新上线的网站出现页面响应速度缓慢的问题, 一位负责这个项目的但并不是搞技术的妹子找到我,让我想办法提升网站的访问速度 ,因为已经有很多用户来投诉了.我第一反应觉的是数据库上的问题,假装思索了一下,摆着一副深沉炫酷的模样说:"是不是数据库查询上出问题了, 给表加上索引吧",然后妹子来了一句:"现在我们网站访问量太大,加索引有可能导致写入数据时性能下降,影响用户使用的".当时我就楞了一下, 有种强行装逼被拆穿的感觉,在自己的专业领域居然被非专业的同学教

数据库索引B+树

面试时无意间被问到了这个问题:数据库索引的存储结构一般是B+树,为什么不适用红黑树等普通的二叉树? 经过和同学的讨论,得到如下几个情况: 1. 数据库文件是放在硬盘上,每次读取数据库都需要在磁盘上搜索,因此需要考虑磁盘寻道时间,我们都知道磁盘寻道开销是非常大的.同时,索引一般也是非常大的,内存不能放下,因此也会放在磁盘上.(另外,还与局部性原理与磁盘预读有关系). 2. B+树所有的关键字都出现在叶子节点的链表(稠密索引)中,且链表中的关键字是有序的.非叶子节点只起索引作用(稀疏索引). 叶子节

数据库索引的实现原理

1 什么是索引 数据库索引,是数据库管理系统中一个排序的数据结构. 对数据记录建立索引后,每条索引记录包含:(1)值与相应 数据记录 被索引列的值一样的键(2)相应数据记录的地址. “索引的实现通常使用B树及其变种B+树”,即采用B树等对 索引记录 按键进行排序. 根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引(唯一).主键索引(唯一非空)和聚集索引(行间逻辑顺序与物理顺序一致,提供更快数据访问). 2 使用索引的利弊 利:加快查询速度 弊:索引需要占用空间:创建和维护索引(插入.

数据库索引的原理

介绍: 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息. 例如这样一个查询:select * from table1 where id=10000.如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止:有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找.由于索引是经过某种算法优化过的,因而查找次数要少的多.可见,索引是用来

数据库索引的原理到底是什么?

中 小企业MIS系统的管理基本上由两大部份组成,一是前台的可视化操作,二是后台的数据库管理.网管对前台的管理和维护工作包括保障网络链路通畅.处理 MIS终端的突发事件以及对操作员的管理.培训等,这是网管们日常做得最多.最辛苦的功课:然而MIS系统架构中同等重要的针对数据库的管理.维护和优化 工作,现实中似乎并没有得到网管朋友的足够重视,看起来这都是程序员的事,事实上,一个网管如果能在MIS设计期间就数据表的规范化.表索引优化.容量设 计.事务处理等诸多方面与程序员进行卓有成效的沟通和协作,那么日