OrientDB中查询的最佳索引

时间:2014-07-22 19:08:40

标签: sql optimization indexing orientdb

我有以下查询

SELECT FROM Post
WHERE activityLog IS NOT NULL
AND activityLog_pointerProcessed IS NULL
LIMIT 1000

属性定义为

CREATE PROPERTY Post.activityLog_pointerProcessed BOOLEAN
CREATE PROPERTY Post.activityLog EMBEDDEDMAP EMBEDDEDMAP

然而,它似乎运行得相当慢。我添加了以下索引

CREATE INDEX Post_activityLog_pointerProcessed
ON Post (activityLog, activityLog_pointerProcessed)
NOTUNIQUE_HASH_INDEX

我想知道这是否是这种情况的最佳索引,或者是否有不同的方法来设置它。 Post类仍在填满,但目前有200万行。查询需要 ~5-10秒才能运行。

这是我explain

时得到的结果
  

orientdb {pumpup}>解释SELECT FROM Post WHERE activityLog IS NOT   NULL和activityLog_pointerProcessed IS NULL LIMIT 1000

     

Profiled命令   '{documentReads:378236,电流:#22:378235,documentAnalyzedCompatibleClass:378236,recordReads:378236,fetchingFromTargetElapsed:337922,评价:378236,经过:337922.88,与resultType:收集,resultSize:1000}'   在338.688995秒(s):   { “@type”: “d”, “@版本”:0 “documentReads”:378236, “当前”: “#22:378235”, “documentAnalyzedCompatibleClass”:378236 “recordReads”:378236 “fetchingFromTargetElapsed”: 337922, “评价”:378236, “经过”:337922.88, “与resultType”: “收集”, “resultSize”:1000, “@域类型”:“documentReads = 1,documentAnalyzedCompatibleClass = 1,recordReads = 1,fetchingFromTargetElapsed = 1,评价= 1,经过= F“}

1 个答案:

答案 0 :(得分:2)

通过阅读说明结果,索引未被使用,扫描了378,236份文件。

activityLog属性已声明为EMBEDDEDMAP,因此内部值被索引,而不是集合为空。我认为它不会起作用,但请尝试在索引上启用空值:

https://github.com/orientechnologies/orientdb/wiki/Indexes#null-values

对于这种情况,最好的方法是保存另一个布尔值" activityLog.empty"被索引并更快地检索您的查询。

CREATE PROPERTY Post.activityLogEmpty BOOLEAN
CREATE INDEX Post_activityLog_pointerProcessed ON Post (activityLogEmpty, activityLog_pointerProcessed) 
                                               NOTUNIQUE_HASH_INDEX

在创建时设置属性" activityLogEmpty"为FALSE并且一旦填充"活动日志"集合将其设置为真。