达梦数据库索引结构详解

索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。索引在逻辑上和物理上都与相关的表的数据无关,作为无关的结构,索引需要存储空间。创建或删除一个索引,不会影响基本的表、数据库应用或其他索引。当插入、更改和删除相关的表的行时, DM8 会自动管理索引。如果删除索引,所有的应用仍继续工作,但访问以前被索引了的数据时速度可能会变慢。

索引是建立在表上的可选对象(聚簇索引除外),它能使对应于表的 SQL 语句执行得更快,因为索引能更快地定位表中记录的位置信息。 DM8 索引能提供访问表数据的最快路径,索引对用户是透明的,无论表上是否有索引,SQL语句的用法都不会改变,索引只是让SQL查询变的更快。

DM8 提供了几种最常见类型的索引,对不同场景有不同的功能,它们分别是:

1. 聚集索引:每一个普通表有且只有一个聚集索引;

2. 唯一索引:索引数据根据索引键唯一;

3. 函数索引:包含函数 / 表达式的预先计算的值;

4. 位图索引: 对低基数的列创建位图索引;

5. 位图连接索引: 针对两个或者多个表连接的位图索引,主要用于数据仓库中;

6. 全文索引:在表的文本列上而建的索引。

除了以上索引类型外,达梦数据库(DM8)还支持空间索引、数组索引等类型。

了解达梦数据库索引的存储结构对于正确使用和优化索引有很大帮助,最常见的索引结构为 B* 树索引,存储结构如下图所示:

最顶层的为根节点,最底层的为叶子节点,中间层为内节点。实际使用当中一般不止 3 层(取决于数据量大小),除根节点以及叶子节点以外仅为内节点。对于一个 m 阶(本例中 m=2)的 B*树存储结构有以下几个特点:

1 、每个结点最多有 m 个子结点。

2 、除了根结点和叶子结点外,每个结点最少有 m/2(向上取整)个子结点。

3 、如果根结点不是叶子结点,那根结点至少包含两个子结点。

4 、所有的叶子结点都位于同一层。

5 、每个结点都包含 k 个元素,这里 m/2 ≤ k < m,这里 m/2 向下取整。

6 、每个节点中的元素从小到大排列。

7 、每个元素左结点的值都小于或等于该元素,右结点的值都大于或等于该元素。

8 、所有的非叶子节点只存储关键字信息。

9 、所有的叶子结点中包含了全部元素的信息。

10 、所有叶子节点之间都有一个链指针。

可以看出在该存储结构中查找特定数据的算法复杂度为 O(log2N),查找速度仅与树高度有关。

对于聚集索引叶子节点存储的元素是数据块即为整行数据,对于非聚集索引叶子节点存储的元素是索引字段的所对应的聚集索引的值或 rowid,如果需要获取其它字段信息需要根据聚集索引的值或 rowid 回表 (BLKUP) 进行查询。

 


请使用浏览器的分享功能分享到微信等