VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

索引

索引是增强数据库性能的常用方法。索引允许数据库服务器比没有索引时更快地查找和检索特定行。但索引也会增加整个数据库系统的开销,因此应该明智地使用它们。

Vastbase E100提供多种不同的索引类型,以在不同的业务场景中提供更高的处理效率:

  • B-Tree(B树)索引

    默认情况下, CREATE INDEX 命令会创建适合最常见情况的B树索引。B树可以处理可以分类为某种排序的数据的相等和范围查询。特别是,只要使用<、<=、=、>=、>运算符之一进行比较时,Vastbase E100查询计划程序就会考虑使用B树索引。

    也可以使用B树索引搜索来实现与这些运算符的组合等效的构造,例如 BETWEEN 和 IN 。此外,索引列上的 IS NULL 或 IS NOT NULL 条件可以与B树索引一起使用。

    如果模式是常量并且锚定到字符串的开头,优化器也可以使用B树索引来处理涉及模式匹配运算符 LIKE 和 ~ 的查询 - 例如, col LIKE 'foo%' 或 col ~ '^foo',但不是 col LIKE '%bar'。但是,如果您的数据库不使用C语言环境,则需要使用特殊的运算符类创建索引,以支持模式匹配查询的索引;也可以对ILIKE 和 ~* 使用B树索引,但前提是模式以非字母字符开头,即不受大写/小写转换影响的字符。

    B树索引也可用于按排序顺序检索数据。这并不总是比简单的扫描和排序更快,但它通常很有帮助。

  • Hash(哈希)索引

    哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

    对于hash相同的,采用链表的方式解决冲突。类似于hashmap。因为索引的结构是十分紧凑的,所以hash索引的查询很快。

    哈希索引只能处理简单的相等比较。只要使用 = 运算符在比较中涉及索引列,查询计划程序就会考虑使用哈希索引。

  • GIN(反向)索引

    GIN索引是”倒排索引”,它适合于包含多个组成值的数据值,例如数组。反向索引中为每一个组成值都包含一个单独的项,它可以高效地处理测试指定组成值是否存在的查询。简单的说就是GIN索引接口常被用于多值列的检索,例如全文检索类型、数组类型。

    与GiST和SP-GiST一样,GIN可以支持许多不同的用户定义索引策略,并且可以使用GIN索引的特定运算符根据索引策略而有所不同。例如,Vastbase E100的标准发行版包括一个数组的GIN运算符类,它支持使用<@、@>、=、&&等运算符的索引查询。

  • RUM索引

    Rum 是一个索引插件,适合全文检索,属于GIN的增强版本:

    1、在Rum索引中,存储了lexem的位置信息,所以在计算ranking时,不需要回表查询(而GIN需要回表查询)。

    2、Rum支持phrase搜索,而GIN无法支持。

    3、在一个Rum索引中,允许用户在posting tree中存储除ctid(行号)以外的字段VALUE,例如时间戳。

    这使得Rum不仅支持GIN支持的全文检索,还支持计算文本的相似度值,按相似度排序等,同时支持位置匹配,而GIN索引则无法做到。

  • GiST索引

    GiST索引不是一种索引,而是一种可以实现许多不同索引策略的基础结构。因此,可以使用GiST索引的特定运算符根据索引策略(运算符类)而变化。例如,Vastbase E100的标准分布包括几个二维几何数据类型的GiST运算符类,它们支持使用<<、&<、&>、>>、<<|、&<|、|&>、|>>、@>、<@、~=、&&等运算符的索引查询。

  • SP-GiST索引

    SP-GiST索引类似于如GiST索引,是一种提供了支持各种搜索的基础结构。SP-GiST允许实现各种不同的非 balancer 的基于磁盘的数据结构,例如四叉树,k-d树和基数树(尝试)。例如,Vastbase E100的标准发行版包括用于二维点的SP-GiST运算符类,它支持使用<<、>>、~=、<@、<^、>^等运算符的索引查询。

  • Brin(块范围)索引

    BRIN索引存储关于存储在表的连续物理块范围中的值的摘要,默认是每128个连续数据块区间存储一个字段取值的区间,所以这个索引的信息量是将1000个数据块划分为几个连续的128个块的区间,然后存储每个区间ID值的取值范围。

    一个非常好的使用场景是流式日志数据,比如用户行为,大批量的数据按时间顺序不停的插入数据表。我们如果要按照时间来访问这样的数据,若采用BTREE索引,会导致索引非常庞大。若采用BRIN,则索引可以变得很小,而且因为数据是按照时间顺序插入的,所以BRIN的信息量也很大,因为每个连续的数据块区间存储的时间范围和其他连续的数据块区间独立性很好,不会出现大量数据交叉。当然,如果有大量数据交叉,那么使用BRIN检索还不如全表扫描。BRIN可认为是全表扫描的切片,如果数据值分布和物理值分布的相关性很好,那么BRIN无疑是非常好的选择。

    与GiST,SP-GiST和GIN一样,BRIN可以支持许多不同的索引策略,并且可以使用BRIN索引的特定运算符因索引而异战略。对于具有线性排序顺序的数据类型,索引数据对应于每个块范围的列中值的最小值和最大值。这支持使用<、<=、=、>=、>等运算符的索引查询。

  • Bloom索引

    Bloom索引属于lossy索引,可以收敛结果集(排除绝对不满足条件的结果,剩余的结果里再挑选满足条件的结果),因此需要二次check,bloom支持任意列组合的等值查询。Bloom存储的是签名,签名越大,耗费的空间越多,但是排除更加精准。

  • Zombodb索引

    Zombodb索引是Vastbase E100与ElasticSearch结合的一个索引接口,可以直接读写ElasticSearch,从而提供SQL接口的搜索引擎,实现数据的透明搜索。

  • 函数索引 / 表达式索引

    索引列不必只是基础表的一列,而是可以是从表的一列或多列计算的函数或标量表达式。此功能对于根据计算结果快速访问表非常有用。

    如果我们要声明这个索引 UNIQUE ,它将阻止创建 col1 值仅在大小写情况下不同的行,以及 col1 值实际上相同的行。因此,表达式上的索引可用于强制执行不能作为简单唯一约束定义的约束。

    索引表达式的维护成本相对较高,因为必须在插入时和每次更新时为每一行计算派生表达式。但是,索引表达式在索引搜索期间不会重新计算,因为它们已存储在索引中。当检索速度比插入和更新速度更重要时,表达式索引很有用。