Hash 和 Skiplists 并行索引?

Hash and Skiplists index in parallel?

对于相同字段,并行具有哈希索引和跳过列表索引是否有意义? Arango 会使用 hash 索引进行相等查询,使用 skiplists 索引进行范围请求吗?

在同一个属性(甚至多个属性)上可以有一个跳过列表索引和一个散列索引。 查询使用哪个索引取决于几个因素:

  • 对于相等查找:索引的选择性估计(如果由索引类型提供)
  • 对于范围查询:使用的边界数(过滤条件如 attribute > leftBound && attribute < rightBoundattribute > leftBound 有更高的机会使用 skiplist 索引)
  • 集合中的文档数
  • 如果索引可以用来优化掉后面的 SORT 子句
  • if the index is sparse:如果条件可以包含null值(此时索引不会被使用,不管是hash还是skiplist索引)

运行 db._explain(query) 将始终在特定查询中显示将使用哪个索引(如果有的话)。

然而,在相同的属性上有多个索引有一个缺点,即每个单独的索引都会稍微减慢对集合的写入速度。对于基于 RocksDB 的索引,每增加一个索引也会消耗磁盘 space。对于基于 MMFiles 的索引,服务器 start/collection 负载上的索引建立时间是一个需要考虑的因素,每个索引的额外 RAM 使用量也是一个因素。

因此,在大多数情况下,这是您可能获得的某些查询的额外查找速度与额外 memory/disk space 和索引 buildup/maintenance 的成本之间的权衡。