2017-08-08 27 views
0

模擬分區我試圖把這個具有以下兩個查詢進行測試,以模擬分區中的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)

我希望(如還討論hereQ2會更快,因爲它只會檢索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

意見夫婦第一:

  1. 它可能不會有所作爲(給出的查詢計劃),但有你不寫Q2爲MATCH (a:USER { UID:362})-[:FRIEND]->(b:P1) RETURN COUNT(b) ?
  2. 的理由有沒有索引或約束在用戶的uid上?

區別似乎是Q1和Q2選擇不同的入口點。 Q1選擇用戶,Q2選擇似乎更有效的P1。我不會(因爲計數)預計查詢時間有很大的差異。 Q1的一個副作用是你可能用User上的掃描加載了內存中的所有內容。

如果你真的想加快速度,把一個索引放在用戶(UID)上。結合P1標籤應該會降低點擊次數。

希望這會有所幫助。

問候, 湯姆

+0

對不起,我應該提到:1。我曾嘗試這一點。它返回完全相同的計劃。似乎沒有區別。 2.有一個關於uid的索引。 Q2挑選入口點並在查詢計劃中稍後測試uid條件,這不奇怪嗎? – kami

+1

確定2?我在問,因爲「NodeByLabelScan」表明它正在掃描具有該標籤的所有節點的整個數據庫。你可以做一個簡單的查詢來驗證? –

+0

哦,謝謝你!我剛剛意識到我在UID上有一個遺留索引,所以我已經更新了查詢,以'START a = node(362)'開頭,現在'Q2'比預期的要快一些。 – kami