【问题标题】:Why is this ArangoDB query too slow?为什么这个 ArangoDB 查询太慢了?
【发布时间】:2015-01-05 14:45:14
【问题描述】:

我是新的 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 秒。

是否可以更快地运行它?

谢谢

雨果

【问题讨论】:

  • 能否提供集合meteo的索引定义,以及查询解释结果?通过查看上面的查询,我只能说属性TMPDTM 上的索引不会被使用,因为这些属性是直接使用的,但它们在函数表达式中使用。为了在TMP 上使用索引,最好将表达式DATE_TIMESTAMP(i.DTM) &lt; DATE_TIMESTAMP("2014-12-10") 转换为i.DTM &lt; "2014-12-10"
  • POM、DTM、TMP字段中有哈希索引
  • @stj 我有原始查询的 explain() 结果和您的建议的查询。我应该在这里发布吗?
  • 是的,请。对于POM 值为Maxial,大约有多少结果?
  • 这个查询的结果有12个值。 Stack 不允许在此处发布解释结果。太长了。

标签: arangodb


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 2020-03-19
    • 2014-03-12
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多