我有以下查询
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“}
答案 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并且一旦填充"活动日志"集合将其设置为真。