数据库系列 -- 数据库索引

225 阅读4分钟

索引是什么?

索引是对数据表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据表中的特定信息

对于此定义我的理解是:数据表就好比是一本书,而索引则是这本书前面的目录。

  • 目录也需要几页纸 —— 对应着索引也需要一定的 物理空间
  • 目录上面对于每个章节、每个内容模块有页码的准确定位 —— 对应着索引里的数据就是对数据表里面的某块数据的 物理地址 进行准确定位

借助这个思想,在此记录一下我的一些理解(有可能有错,欢迎指出)

  • 在内存中创建一个变量,下次访问能够以 O(1) 的速度快速访问是因为计算机系统内记录了该变量的内存地址,因此能够快速抵达;
  • 对于数组:创建一个具有 10 个元素的数组 arr,arr[5] 能够以 O(1) 的速度快速访问到数据是因为:计算机系统以 O(1) 的速度快速抵达 arr[0] 所在的内存地址,然后通过 5 - 0 等其他的计算得到 arr[5] 的内存地址,然后快速抵达;
  • 对于对象:创建一个具有 name、age 属性的对象 obj,obj.name 能够以 O(1) 的速度快速访问到数据是因为:对象所占用的内存空间中不仅有属性的值所需要的空间,还有和属性绑定在一起的、记录属性的值所在内存地址的值,所以只要告知计算机系统属性名称,就能快速获取到属性的值。

数据库索引

数据库就好比是一个大大的对象 / 数组,里面嵌套着一层或多层的对象 / 数组,数据库里面的数据是海量的,所以我们需要对这些数据进行管理:为数据库里面所有的数据设置索引,实现快速访问

索引是:定义在 table 基础之上,有助于 无需检查所有记录 而快速定位所需记录的一种 辅助存储结构,由一系列存储在磁盘上的 索引项 组成,每一种索引项由 索引字段行指针 构成

索引的好处?

  • 通过创建索引,可以在查询的过程中,提高系统的性能
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  • 在使用分组和排序子句进行数据检索时,可以减少查询分组和排序的时间;

为什么索引可以使数据库的检索速度加快

我理解是这样的:数据库的数据结构就是一棵树:大 → 中 → 小 → 更小

image.png

数据库就相当于一本大大的书,一条条数据就好比书的某个章节,而索引就是书的目录,索引存的就是内存地址,就好比一本书的页码,可以从目录快速到达指定章节,如果对数据进行排序,对索引进行排序即可

索引的坏处?

  • 创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大;
  • 索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大;

什么是稠密索引和稀疏索引?

  • 稠密索引:对于主文件中每一个记录都对应一个索引项;
    • 候选键属性的稠密索引:先查索引,然后再依据索引读主文件;
    • 非候选键属性的稠密索引:
      • 主文件按索引字段排序,索引文件中的索引字段值无重复;
      • 主文件索引字段未排序,但索引文件中的索引字段值是有重复的;
      • 主文件索引字段未排序且索引文件中的索引字段值无重复,这时可以引入指针桶来处理;
  • 稀疏索引:对于主文件中部分记录有索引项和它对应(要求主文件必须是按对应索引字段属性排序存储);

什么是主索引和辅助索引?

  • 主索引:对每个存储块有一个索引项,每个存储块的第一个记录叫锚,通常建立在有序文件的基于主码的排序字段上,属于稀疏索引;
  • 辅助索引:是定义在主文件的任一或多个非排序字段上的辅助存储结构,属于稠密索引;

什么是聚簇索引和非聚簇索引?

  • 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据,主文件按照对应字段排序存储,索引文件无重复排序存储;
  • 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,主文件并没有按照对应字段排序存储,索引文件有重复排序存储;

例子

参考文章