为 same 字段设置哈希索引和跳过列表 in parallel 是否有意义? Arango会使用哈希索引进行相等查询,还使用跳过列表索引进行范围请求?
可以在同一属性(甚至多个属性)上具有跳转列表索引和哈希索引 . 查询使用哪个索引取决于几个因素:
用于等式查找:索引的选择性估计(如果由索引类型提供)
用于范围查询:使用的边界数(过滤条件如 attribute > leftBound && attribute < rightBound 将有更高的机会使用跳过列表索引而不仅仅是 attribute > leftBound )
attribute > leftBound && attribute < rightBound
attribute > leftBound
集合中的文档数量
如果索引可用于优化后来的SORT子句
如果索引是稀疏的:如果条件可以包含 null 值(在这种情况下,将不使用索引,无论它是散列索引还是跳转列表索引)
null
将通过在特定查询上运行 db._explain(query) 来始终显示将使用哪个索引(如果有的话) .
db._explain(query)
但是,在相同属性上具有多个索引的缺点是每个单独的索引会减慢对集合的写入速度 . 对于基于RocksDB的索引,每个附加索引也将占用磁盘空间 . 对于基于MMFiles的索引,服务器启动/收集负载上的索引构建时间是要考虑的因素以及每个索引的额外RAM使用情况 .
因此,在大多数情况下,这是在某些查询可能获得的额外查找速度与额外内存/磁盘空间和索引构建/维护成本之间的权衡 .
1 回答
可以在同一属性(甚至多个属性)上具有跳转列表索引和哈希索引 . 查询使用哪个索引取决于几个因素:
用于等式查找:索引的选择性估计(如果由索引类型提供)
用于范围查询:使用的边界数(过滤条件如
attribute > leftBound && attribute < rightBound
将有更高的机会使用跳过列表索引而不仅仅是attribute > leftBound
)集合中的文档数量
如果索引可用于优化后来的SORT子句
如果索引是稀疏的:如果条件可以包含
null
值(在这种情况下,将不使用索引,无论它是散列索引还是跳转列表索引)将通过在特定查询上运行
db._explain(query)
来始终显示将使用哪个索引(如果有的话) .但是,在相同属性上具有多个索引的缺点是每个单独的索引会减慢对集合的写入速度 . 对于基于RocksDB的索引,每个附加索引也将占用磁盘空间 . 对于基于MMFiles的索引,服务器启动/收集负载上的索引构建时间是要考虑的因素以及每个索引的额外RAM使用情况 .
因此,在大多数情况下,这是在某些查询可能获得的额外查找速度与额外内存/磁盘空间和索引构建/维护成本之间的权衡 .