为什么这个 ArangoDB 查询太慢了?

Why is this ArangoDB query too slow?

我是 ArangoDB 的新用户,我正在使用以下查询

FOR i IN meteo
FILTER
    i.`POM` == "Maxial"
    && TO_NUMBER(i.`TMP`) < 4.2
    && DATE_TIMESTAMP(i.`DTM`) > DATE_TIMESTAMP("2014-12-10")
    && DATE_TIMESTAMP(i.`DTM`) < DATE_TIMESTAMP("2014-12-15")
RETURN
    i.`TMP`

关于 200 万个文档集合。它在过滤的三个字段上有一个索引。大约需要。 Web 界面上 9 秒。

是否可以运行得更快?

谢谢

雨果

我无法访问底层数据和数据分布,也没有确切的索引定义,所以我只能给出相当笼统的建议:

  1. 使用 explain() 命令查看查询是否使用了索引,如果使用了索引。
  2. 如果explain()显示没有使用索引,检查查询的FILTER条件中包含的属性是否真的被索引了。有 db.<collection>.getIndexes() 命令来检查哪些属性被索引。
  3. 如果索引存在但未被查询使用,则索引的类型可能有误。例如,哈希索引将仅用于相等比较(即 ==)而不用于其他比较类型(<<=>>= ETC。)。只有在查询的 FILTER 条件中使用了所有索引属性时,才会使用散列索引。只有在 FILTER 条件中至少使用了它的第一个属性时,才会使用跳过列表索引。如果在查询中指定了更多的 skiplist 索引属性(从左到右),它们也可以被使用并允许过滤更多文档。
  4. 扫描集合时只会选择一个索引。在 "POM""TMP""DTM" 上有多个单独的索引对这个查询没有帮助,因为它只会在迭代的每个集合中使用其中一个。相反,如果查询可以从中受益,我建议尝试将多个属性放入索引中。
  5. 索引越有选择性越好。例如,单个属性的索引可能会过滤很多文档,但多个属性的组合索引可能会过滤更多文档。对于这个特定的查询,[ "POM", "DTM" ] 上的跳过列表索引可能是正确的选择(结合 6.)
  6. 优化器可能考虑在给定原始查询中进行索引查找的唯一属性是 "POM" 属性。原因是其他属性在函数调用中使用(即 TO_NUMBER()DATE_TIMESTAMP())。通常,索引不会用于函数内部使用的属性(例如 TO_NUMBER(i.tmp) < 4.2 不会使用索引。DATE_TIMESTAMP(i.DTM) > DATE_TIMESTAMP("2014-12-10") 也是如此。修改条件以便将索引属性直接与某个常量进行比较或一次性计算值可以启用更多候选索引。如果可能,请尝试重写条件,以便在比较的一侧只存在索引属性。对于此特定查询,最好使用 i.DTM > "2014-12-10" 而不是 DATE_TIMESTAMP(i.DTM) > DATE_TIMESTAMP("2014-12-10").