索引是什么?
索引是对数据表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据表中的特定信息
对于此定义我的理解是:数据表就好比是一本书,而索引则是这本书前面的目录。
- 目录也需要几页纸 —— 对应着索引也需要一定的 物理空间
- 目录上面对于每个章节、每个内容模块有页码的准确定位 —— 对应着索引里的数据就是对数据表里面的某块数据的 物理地址 进行准确定位
借助这个思想,在此记录一下我的一些理解(有可能有错,欢迎指出)
- 在内存中创建一个变量,下次访问能够以 O(1) 的速度快速访问是因为计算机系统内记录了该变量的内存地址,因此能够快速抵达;
- 对于数组:创建一个具有 10 个元素的数组 arr,arr[5] 能够以 O(1) 的速度快速访问到数据是因为:计算机系统以 O(1) 的速度快速抵达 arr[0] 所在的内存地址,然后通过 5 - 0 等其他的计算得到 arr[5] 的内存地址,然后快速抵达;
- 对于对象:创建一个具有 name、age 属性的对象 obj,obj.name 能够以 O(1) 的速度快速访问到数据是因为:对象所占用的内存空间中不仅有属性的值所需要的空间,还有和属性绑定在一起的、记录属性的值所在内存地址的值,所以只要告知计算机系统属性名称,就能快速获取到属性的值。
数据库索引
数据库就好比是一个大大的对象 / 数组,里面嵌套着一层或多层的对象 / 数组,数据库里面的数据是海量的,所以我们需要对这些数据进行管理:为数据库里面所有的数据设置索引,实现快速访问
索引是:定义在 table 基础之上,有助于 无需检查所有记录 而快速定位所需记录的一种 辅助存储结构,由一系列存储在磁盘上的 索引项 组成,每一种索引项由 索引字段 和 行指针 构成
索引的好处?
- 通过创建索引,可以在查询的过程中,提高系统的
性能; - 通过创建唯一性索引,可以保证数据库表中每一行数据的
唯一性; - 在使用分组和排序子句进行数据检索时,可以
减少查询中分组和排序的时间;
为什么索引可以使数据库的检索速度加快
我理解是这样的:数据库的数据结构就是一棵树:大 → 中 → 小 → 更小
数据库就相当于一本大大的书,一条条数据就好比书的某个章节,而索引就是书的目录,索引存的就是内存地址,就好比一本书的页码,可以从目录快速到达指定章节,如果对数据进行排序,对索引进行排序即可
索引的坏处?
创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大;- 索引需要
占用物理空间,如果要建立聚簇索引,所需要的空间会更大;
什么是稠密索引和稀疏索引?
- 稠密索引:对于主文件中每一个记录都对应一个索引项;
- 候选键属性的稠密索引:先查索引,然后再依据索引读主文件;
- 非候选键属性的稠密索引:
- 主文件按索引字段排序,索引文件中的索引字段值无重复;
- 主文件索引字段未排序,但索引文件中的索引字段值是有重复的;
- 主文件索引字段未排序且索引文件中的索引字段值无重复,这时可以引入指针桶来处理;
- 稀疏索引:对于主文件中部分记录有索引项和它对应(要求主文件必须是按对应索引字段属性排序存储);
什么是主索引和辅助索引?
- 主索引:对每个存储块有一个索引项,每个存储块的第一个记录叫锚,通常建立在有序文件的基于主码的排序字段上,属于稀疏索引;
- 辅助索引:是定义在主文件的任一或多个非排序字段上的辅助存储结构,属于稠密索引;
什么是聚簇索引和非聚簇索引?
- 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据,主文件按照对应字段排序存储,索引文件无重复排序存储;
- 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,主文件并没有按照对应字段排序存储,索引文件有重复排序存储;