数据库内幕系列-为什么需要索引
索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。数据是存储在磁盘上的,操作系统读取磁盘的最小单位是块,如果没有索引,会加载所有的数据到内存,依次进行检索,加载的总数据会很多,磁盘IO多。
磁盘IO为什么会慢?
磁盘慢是由于其硬件结构决定的


- 很多个盘片被串在一个主轴上,主轴带着他们快速的旋转;
- 每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区;
- 多个盘片上的同一位置的磁道组成了一个柱面;
- 每个盘片上都有可以读写数据的磁头
- 一个盘片包含两个盘面
- 扇区是被间隙分隔的圆的片段,间隙大约占整个磁道10%,用于帮助标识扇区起点;扇区是读写磁盘时的最小单位,一个块包含一个或多个扇区。
访问数据时,可以说:把1柱面,1磁头,1扇区的数据取出来?
1.磁盘会把磁头挪到1柱面,就是对应的磁道, 这叫“寻道时间”;
2.旋转磁盘,让磁头指向1扇区,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好;
3.磁盘控制器读取或写数据时,数据所在的扇区和扇区间的空隙经过磁头,此时间称为“传输时间”。
磁盘访问一个块大约需要10ms,其中寻道时间占总时间的大头。
从上面可以看出磁盘顺序读写比随机读写的性能高很多的原因在于:顺序读写理论上只需要一次寻道时间。
结构比较复杂,但操作系统给封装了,提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1, 2, 3, ..n,把指定的块转化成柱面,磁头,扇区, 按照上面说的方法寻道,旋转,读取数据。
扇区是对硬盘而言,块是对文件系统而言,块是文件存取的最小单位,一般一个块由连续的几个扇区组成。

为了更一步简化操作系统对文件的操作,文件使用inode结构,通过它可以轻松的找到这个文件所使用的所有磁盘块。
表的结构:

A. 磁盘空间被划分为许多大小相同的块(Block)
B. 一个表的这些数据块以链表的方式串联在一起。
C. 数据是以行(Row)为单位一行一行的存放在磁盘上的块中,如图所示.
D. 在访问数据时,一次从磁盘中读出或者写入至少一个完整的Block。
数据基本操作的实现:
数据库基本操作包括:select、insert、update、delete
--select
A. 定位数据
B. 读出数据所在的块,对数据加工
C. 返回数据给用户
- UPDATE、DELETE
A. 定位数据
B. 读出数据所在的块,修改数据
C. 写回磁盘
- INSERT
A.定位数据要插入的页(如果数据需要排序)
B. 读出要插入的数据页,插入数据.
C. 写回磁盘
在没有索引的情况下是如何定位数据的?
- 表扫描(Table Scan)
A. 从磁盘中依次读出所有的数据块,一行一行的进行数据匹配。
B. 时间复杂度 是O(n), 如果所有的数据占用了100个块。尽管只查询一行数据,也需要读出所有100个块的数据。
C. 需要大量的磁盘IO操作,极大的影响了数据定位的性能。
如何减少磁盘IO?
1. 减少数据占用的磁盘空间
压缩算法、优化数据存储结构
2. 磁盘访问加速
可以通过一些技术以较快的速度访问磁盘,这些技术包括---将数据分布到若干个磁盘中(分割),镜像磁盘(保存数据的若干个拷贝,也运行并行访问),组织数据,使这些数据以磁道或柱面为一个整体的方式被访问。
3. 使用更快速的磁盘类型
使用SSD替换掉STAT盘
4. 减少访问数据的总量(实现方式即索引)
读出或写入的数据中,有一部分是数据操作所必须的,这部分称作有效数据。剩余的部分则不是数据操作必须的数据,称为无效数据。例如,查询姓名是‘张三’的记录;那么这条记录是有效记录,其他记录则是无效记录。我们要努力减少无效数据的访问。

浙公网安备 33010602011771号