模擬分區我試圖把這個具有以下兩個查詢進行測試,以模擬分區中的Neo4j(V3.1):在Neo4j的
Q1: MATCH (a:USER { UID:362})-[:FRIEND]->(b) WHERE b.PARTITION=1 RETURN COUNT(b)
Q2: MATCH (a:USER { UID:362})-[:FRIEND]->(b) WHERE b:P1 RETURN COUNT(b)
我希望(如還討論here) Q2
會更快,因爲它只會檢索P1
標籤,而Q1
需要在過濾它們之前檢索所有節點。事實證明,Q1
更快,當我更改查詢遍歷更多深度[:FRIEND*1..5]
時,這變得更加明顯。
編輯:有UID
索引和PARTITION
沒有索引。
查詢計劃如下使用嵌入式Neo4j(由於某些原因不顯示DBhits)。
Q1
+-------------------+----------------+------------------+-----------------------------+
| Operator | Estimated Rows | Variables | Other |
+-------------------+----------------+------------------+-----------------------------+
| +ProduceResults | 191 | COUNT(b) | COUNT(b) |
| | +----------------+------------------+-----------------------------+
| +EagerAggregation | 191 | COUNT(b) | |
| | +----------------+------------------+-----------------------------+
| +Filter | 36341 | anon[33], a, b | b.PARTITION == { AUTOINT1} |
| | +----------------+------------------+-----------------------------+
| +Expand(All) | 363412 | anon[33], b -- a | (a)-[:FRIEND]->(b) |
| | +----------------+------------------+-----------------------------+
| +Filter | 105719 | a | a.UID == { AUTOINT0} |
| | +----------------+------------------+-----------------------------+
| +NodeByLabelScan | 1057194 | a | :USER |
+-------------------+----------------+------------------+-----------------------------+
Total database accesses: ?
Q2
+-------------------+----------------+------------------+----------------------------------+
| Operator | Estimated Rows | Variables | Other |
+-------------------+----------------+------------------+----------------------------------+
| +ProduceResults | 214 | COUNT(b) | COUNT(b) |
| | +----------------+------------------+----------------------------------+
| +EagerAggregation | 214 | COUNT(b) | |
| | +----------------+------------------+----------------------------------+
| +Filter | 45909 | anon[33], a, b | a:USER AND a.UID == { AUTOINT0} |
| | +----------------+------------------+----------------------------------+
| +Expand(All) | 459085 | anon[33], a -- b | (b)<-[:FRIEND]-(a) |
| | +----------------+------------------+----------------------------------+
| +NodeByLabelScan | 134181 | b | :P1 |
+-------------------+----------------+------------------+----------------------------------+
Total database accesses: ?
對背後的原因是什麼這個也許任何想法?
對不起,我應該提到:1。我曾嘗試這一點。它返回完全相同的計劃。似乎沒有區別。 2.有一個關於uid的索引。 Q2挑選入口點並在查詢計劃中稍後測試uid條件,這不奇怪嗎? – kami
確定2?我在問,因爲「NodeByLabelScan」表明它正在掃描具有該標籤的所有節點的整個數據庫。你可以做一個簡單的查詢來驗證? –
哦,謝謝你!我剛剛意識到我在UID上有一個遺留索引,所以我已經更新了查詢,以'START a = node(362)'開頭,現在'Q2'比預期的要快一些。 – kami