源码家族
当前位置:首页 > 资讯中心

资讯中心

【 常用的索引数据结构 】

发布时间:2021-08-17 09:32:47 阅读次数:183

如果没有索引,查询某行数据,只能进行全表扫描。这时,需要频繁地进行磁盘I/O,性能很差。索引的基本思想,就是减少一次查询所产生的磁盘I/O次数,提升查询效率。

索引一般是一个key-value结构,key是索引值。 对于聚集索引(如InnoDB的主键索引),value是该行的所有数据。 对于非聚集索引(如MyISAM索引),value是该行数据所在的磁盘块的指针。

  1. 二叉树(非平衡二叉树) 弊端:无法保证平衡性。极端情况下,可能退化成链表。此时,查询约等于全表扫描。

  2. 红黑树(平衡二叉树)

    1. 优势:平衡树,不会退化成链表,相较于非平衡二叉树,查询效率有一定提升。

    2. 弊端:当数据量较大时,树的高度不可控,可能导致磁盘IO次数较多,效率下降。

    3. 优化思路:让一个树的节点存储更多的索引元素,从而降低树的高度。

  3. B树

  1. 特性:

    1. 树的每个节点,存储多个索引元素,同时存储索引对应的数据。

    2. 叶节点具有相同的深度,叶节点的指针为空。

    3. 所有索引元素不重复。

    4. 节点中的数据索引从左到右递增排列。

  2. 弊端:

    1. 树的所有节点(包括叶子节点和非叶子节点)都同时存储索引和数据,导致每个索引元素所占空间较大。当树的节点空间一定时,每个节点保存的索引元素数量就较少,最终导致树的高度较高。

    2. 树的每个节点的大小是固定的,一般为一页(Page)16KB。可通过命令查看: show global status like ‘Innodb_page_size’;

  3. 优化思路:尽可能减少每个索引元素所占的空间大小,使得每个树节点可以存储更多的索引元素,从而减小树的高度。

  4. B+树

  1. 特性:

    1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引。

    2. 叶子节点包含所有索引字段和对应的数据。

    3. 节点中的数据索引从左到右递增排列。

    4. 叶子节点用双向指针连接,提高区间访问的性能。

  2. 优势:

    1. 树高度较矮,针对大多数的表,2~4层即可满足需求。

    2. 区间访问性能较好。

  1. Hash

  1. 特性:对索引值进行hash,映射成对应数据行所在的磁盘文件指针。

  2. 弊端:

    1. 不支持范围查询。

    2. 不支持模糊查询。

    3. 不支持排序。

    4. 哈希冲突问题。

  3. 适用场景:大量等值查询时。

三. 存储引擎下的索引实现

存储引擎的粒度是表级别的。同一个数据库下的不同表,可以使用不同的存储引擎。

  1. MyISAM引擎

  1. MyISAM为聚集索引,索引文件和数据文件分离,索引数据保存的是对应行所在的磁盘文件指针。

  2. MyISAM使用3个文件保存数据:

    1. .frm:保存表的定义、结构等元信息。

    2. .MYD:保存表中的所有数据行。

    3. .MYI:保存表中的所有索引字段。

  3. InnoDB引擎

  1. 在 InnoDB 中,表都是根据主键的顺序,以索引的形式存放的,这种存储方式的表称为索引组织表

  2. InnoDB 的主键索引为聚集索引,索引的叶子节点保存的是该行的所有数据。

  3. InnoDB 使用2个文件保存数据:

    1. .frm:保存表的定义、结构等元信息。

    2. .ibd:同时保存InnoDB的数据和索引。

  4. 对于主键索引,叶子节点的内容是所在行的所有数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。

  5. 对于非主键索引,叶子节点的内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

  6. 基于非主键索引的查询时,需要根据查询到的主键值,再去主键索引查询一次记录,这个过程称为回表。回表会导致多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。


上一篇:Go语言键值循环
下一篇:Go语言switch case语句