Hash 和 Skiplists 并行索引?
Hash and Skiplists index in parallel?
对于相同字段,并行具有哈希索引和跳过列表索引是否有意义? Arango 会使用 hash 索引进行相等查询,使用 skiplists 索引进行范围请求吗?
在同一个属性(甚至多个属性)上可以有一个跳过列表索引和一个散列索引。
查询使用哪个索引取决于几个因素:
- 对于相等查找:索引的选择性估计(如果由索引类型提供)
- 对于范围查询:使用的边界数(过滤条件如
attribute > leftBound && attribute < rightBound
比 attribute > 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 的成本之间的权衡。
对于相同字段,并行具有哈希索引和跳过列表索引是否有意义? Arango 会使用 hash 索引进行相等查询,使用 skiplists 索引进行范围请求吗?
在同一个属性(甚至多个属性)上可以有一个跳过列表索引和一个散列索引。 查询使用哪个索引取决于几个因素:
- 对于相等查找:索引的选择性估计(如果由索引类型提供)
- 对于范围查询:使用的边界数(过滤条件如
attribute > leftBound && attribute < rightBound
比attribute > 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 的成本之间的权衡。