2015-01-05 69 views
2

我是新ArangoDB用户,我使用在2万笔收集以下查询为什么这个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` 

。它有三个被过滤的字段的索引。它需要aprox。 Web界面上9秒。

运行速度有可能吗?

谢谢

雨果

+0

你能提供集合'meteo'的索引定义和查询解释结果吗?我可以从上面的查询中看到,属性'TMP'和'DTM'上的索引不会被使用,因为这些属性是直接使用,但他们在函数表达式中使用。为了在'TMP'上使用索引,最好将表达式DATE_TIMESTAMP(即。DTM) stj

+0

在POM,DTM和TMP字段中有散列索引 – Hugo

+0

@stj我有原始查询的explain()结果和查询与您的建议。我应该在这里发布吗? – Hugo

回答

3

我有基础数据和数据分配,也不进行精确索引定义进不去,所以我只能放弃,而一般建议:

  1. 使用explain()命令,以查看查询是否使用索引,如果是,哪个。
  2. 如果explain()显示没有使用索引,请检查包含在查询的FILTER条件中的属性是否实际编入索引。有db.<collection>.getIndexes()命令来检查哪些属性被索引。
  3. 如果索引存在但未被查询使用,则索引可能具有错误的类型。例如,散列索引将仅用于相等比较(即==),但不适用于其他比较类型(<,<=,>,>=等)。只有在查询的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")