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

时间:2015-01-05 14:45:14

标签: arangodb

我是新的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万份文件集。它有三个被过滤字段的索引。需要aprox。 Web界面上有9秒。

是否可以更快地运行它?

谢谢

雨果

1 个答案:

答案 0 :(得分:3)

我无法访问基础数据和数据分发,也无法访问确切的索引定义,所以我只能给出相当一般的建议:

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