数据库内幕系列-为什么需要索引

索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。数据是存储在磁盘上的,操作系统读取磁盘的最小单位是块,如果没有索引,会加载所有的数据到内存,依次进行检索,加载的总数据会很多,磁盘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. 减少访问数据的总量(实现方式即索引)
  读出或写入的数据中,有一部分是数据操作所必须的,这部分称作有效数据。剩余的部分则不是数据操作必须的数据,称为无效数据。例如,查询姓名是‘张三’的记录;那么这条记录是有效记录,其他记录则是无效记录。我们要努力减少无效数据的访问。

 

posted @ 2020-10-15 14:45  DUAN的博客  阅读(386)  评论(0)    收藏  举报