专栏首页用户4352451的专栏稀疏索引和稠密索引你了解吗?

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

背景

最近参加了一个面试,面试官先问了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技术引擎内幕》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql 中的innoDB 引擎的B+树索引

    在优化慢接口的时候,遇到一个问题,在通过索引查询数据库表的时候根据时间区间去扫描表的时候,开始时间时表扫描的其实位置吗?或者说根据时间日期B+索引能一次性定位到...

    居士
  • 什么是索引?(补充)

    索引是一种算法(B-tree,HASH等),索引也就是将数据列以某种算法的方式进行排列(如B-tree)本是通过全表查询(ALL) 而通过建立索引而使列数据变为...

    居士
  • 一看就会的mysql索引优化(真实案例)

    (使用的数据库:MYSQL 5.7 版本,InnoDB 引擎) 自从服务加了Skywalking后,将大部分慢接口暴露出来。于是就有了这次慢接口的优化。大概的...

    居士
  • Mysql探索(一):B-Tree索引

    MySQL是目前业界最为流行的关系型数据库之一,而索引的优化也是数据库性能优化的关键之一。所以,充分地了解MySQL索引有助于提升开发人员对MySQL数...

    程序员历小冰
  • MySQL深入学习第五篇 - 深入浅出索引(下)

    在上一篇文章中,介绍了 InnoDB 索引的数据结构模型,今天我们再继续介绍一下 MySQL 索引有关的概念。

    越陌度阡
  • MySQL的干货你了解吗?

    想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里?

    故里
  • 高性能MySQL第五章 读书笔记

    用户7962184
  • 看了这篇MySQL,开发功力又升级

    大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚! 死鬼~看完记得给我来个三连哦!

    蔡不菜丶
  • MySQL系列 | 索引数据结构大全

    对于二叉树而言,每个节点只能有两个子节点,如果是一颗单边二叉树,查询某个节点的次数与节点所处的高度相同,时间复杂度为 O(n);如果是一颗平衡二叉树,查找效率高...

    Tinywan
  • MySql学习笔记(二)- 索引的设计和使用

    作为开发人员,数据库的索引是我们再熟悉不过的了。那么实话真的会了吗,在项目开发中随便定义一个int、varchar后边跟个primary key或者加个inde...

    程序员_备忘录

扫码关注云+社区

领取腾讯云代金券