背景
最近参加了一个面试,面试官先问了mysql的数据库的索引的底层数据接口,我回答了:平时都用的是innodb引擎,所以其底层的索引数据类型是B+树。面试官问我用没用过稀疏索引。当时就懵了,聚集索引,非聚集索引,主键索引,覆盖索引等等,我也没听过什么是稀疏索引。我反问了一下 面试官这个索引类型是mysql新出的吗,我不太了解也没有怎么用过,面试官模糊的给我回答了一下:一个占用空间小查询效率相对低,一个查询效率高,存储空间比较大,用法是在创建索引的时候进行设置参数。我坦白道:不清楚,下去了解一下。
稠密索引和稀疏索引
基本概念
-
稠密索引: 在密集索引中,数据库中的每个搜索键值都有一个索引记录。这样可以加快搜索速度,但需要更多空间来存储索引记录本身。索引记录包含搜索键值和指向磁盘上实际记录的指针。
-
稀疏索引: 在稀疏索引中,不会为每个搜索关键字创建索引记录。此处的索引记录包含搜索键和指向磁盘上数据的实际指针。要搜索记录,我们首先按索引记录进行操作,然后到达数据的实际位置。如果我们要寻找的数据不是我们通过遵循索引直接到达的位置,那么系统将开始顺序搜索,直到找到所需的数据为止。
Innodb底层存储数据
B+树索引的两种类型
-
- 聚集索引: 通过每张表的主键顺序进行存放,其叶子节点存放的是这张表的每行完整数据。也正是我们有时称呼的主键索引(对比一下稠密索引)
-
- 非聚集索引(辅助索引,二级索引):
其叶子节点并不包含行记录的全部数据,其叶子结点的数据包含书签和键值(用于创建索引的字段值),书签的作用是找与索引相对应的行数据。也就是对应聚集索引的主键值。你是否有想过对应的描述的索引值
- 非聚集索引(辅助索引,二级索引):
关系
- 看完稀疏索引和稠密索引还有聚集索引和非聚集索引的概念,我们是否能看出他们有什么关系。
- 聚簇索引(主键索引)是稠密索引,因为主键索引是所有的值都不为空,每一个搜索码都会有对应的行记录。
- 非聚集索引是稀疏索引,非聚集索引有唯一索引,普通索引,复合索引。他们的特征就是不会为表得每个值创建搜索码,而是为单个或多个字段创建,且行记录的某些值可以为null。当我们的where条件不止单个条件的时候我们也会首先通过索引查找出来一批数据,然后进行顺序查找筛选,所以是完全复合稀疏索引的条件的。
优势
- 通过上面的了解,稀疏索引占用空间少,但是在查询的精确率上还是相对于稠密索引还是比较慢的,因为不需要顺序查找,还有回表。
- 稠密索引那就是相对来说比较快,因为他可以精确定位数据,但是占用的空间比较大。
总结脑图
- 数据库索引的名称感觉好多呀,各种一个索引类型感觉有好多名称,大概通过脑图描述一下。
了解过后感觉面试官说的也不正确,问mysql为什么要问稀疏索引??? 我挺疑问的。
参考
- https://stackoverflow.com/questions/36808877/difference-between-sparse-index-and-dense-index
- https://zhuanlan.zhihu.com/p/35811482
- https://practice.geeksforgeeks.org/problems/what-is-dense-indexing-and-sparse-indexing
- https://www.tutorialspoint.com/dbms/dbms_indexing.htm
- 《mysql技术引擎内幕》