稀疏索引和稠密索引你了解吗?

背景

最近参加了一个面试,面试官先问了mysql的数据库的索引的底层数据接口,我回答了:平时都用的是innodb引擎,所以其底层的索引数据类型是B+树。面试官问我用没用过稀疏索引。当时就懵了,聚集索引,非聚集索引,主键索引,覆盖索引等等,我也没听过什么是稀疏索引。我反问了一下 面试官这个索引类型是mysql新出的吗,我不太了解也没有怎么用过,面试官模糊的给我回答了一下:一个占用空间小查询效率相对低,一个查询效率高,存储空间比较大,用法是在创建索引的时候进行设置参数。我坦白道:不清楚,下去了解一下。

稠密索引和稀疏索引

基本概念

  • 稠密索引: 在密集索引中,数据库中的每个搜索键值都有一个索引记录。这样可以加快搜索速度,但需要更多空间来存储索引记录本身。索引记录包含搜索键值和指向磁盘上实际记录的指针。
    在这里插入图片描述

  • 稀疏索引: 在稀疏索引中,不会为每个搜索关键字创建索引记录。此处的索引记录包含搜索键和指向磁盘上数据的实际指针。要搜索记录,我们首先按索引记录进行操作,然后到达数据的实际位置。如果我们要寻找的数据不是我们通过遵循索引直接到达的位置,那么系统将开始顺序搜索,直到找到所需的数据为止。
    在这里插入图片描述

Innodb底层存储数据

B+树索引的两种类型

    1. 聚集索引: 通过每张表的主键顺序进行存放,其叶子节点存放的是这张表的每行完整数据。也正是我们有时称呼的主键索引(对比一下稠密索引)
    1. 非聚集索引(辅助索引,二级索引):
      其叶子节点并不包含行记录的全部数据,其叶子结点的数据包含书签和键值(用于创建索引的字段值),书签的作用是找与索引相对应的行数据。也就是对应聚集索引的主键值。你是否有想过对应的描述的索引值

关系

  1. 看完稀疏索引和稠密索引还有聚集索引和非聚集索引的概念,我们是否能看出他们有什么关系。
  2. 聚簇索引(主键索引)是稠密索引,因为主键索引是所有的值都不为空,每一个搜索码都会有对应的行记录。
  3. 非聚集索引是稀疏索引,非聚集索引有唯一索引,普通索引,复合索引。他们的特征就是不会为表得每个值创建搜索码,而是为单个或多个字段创建,且行记录的某些值可以为null。当我们的where条件不止单个条件的时候我们也会首先通过索引查找出来一批数据,然后进行顺序查找筛选,所以是完全复合稀疏索引的条件的。

优势

  1. 通过上面的了解,稀疏索引占用空间少,但是在查询的精确率上还是相对于稠密索引还是比较慢的,因为不需要顺序查找,还有回表。
  2. 稠密索引那就是相对来说比较快,因为他可以精确定位数据,但是占用的空间比较大。

总结脑图

在这里插入图片描述

  1. 数据库索引的名称感觉好多呀,各种一个索引类型感觉有好多名称,大概通过脑图描述一下。
了解过后感觉面试官说的也不正确,问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技术引擎内幕》

猜你喜欢

转载自blog.csdn.net/weixin_40413961/article/details/108903952