2015-11-25 133 views
1

某些SELECT語句需要幾秒鐘才能返回數據,我想知道是否以及如何提高性能。數據庫通常很小(〜10-40MB),但數據量越大,需要的時間越長。 一個例子查詢這需要很長的是以下幾點:如何提高sqlite SELECT性能?

SELECT intf_id FROM interfaces 
WHERE intfType IN (SELECT intfType FROM interfaces 
WHERE intf_id=39151) 
AND macAddress IN (SELECT l2_addr FROM neighbor 
INNER JOIN nlink ON nlink.neighbor_neighbor_id=neighbor.neighbor_id 
INNER JOIN interfaces ON interfaces.intf_id=nlink.interfaces_intf_id 
WHERE interfaces.intf_id=39151) 
AND status LIKE 'UP' AND phl=1 AND intf_id <> 39151 

也許是因爲嵌套的SELECT語句的?

的DB佈局如下: DB Layout

EXPLAIN查詢計劃輸出: enter image description here

EXPLAIN查詢計劃CSV:

"0","0","0","SCAN TABLE interfaces USING COVERING INDEX ii1" 
"0","0","0","EXECUTE LIST SUBQUERY 1" 
"1","0","0","SEARCH TABLE interfaces USING INTEGER PRIMARY KEY (rowid=?)" 
"0","0","0","EXECUTE LIST SUBQUERY 2" 
"2","0","2","SEARCH TABLE interfaces USING INTEGER PRIMARY KEY (rowid=?)" 
"2","1","0","SCAN TABLE neighbor" 
"2","2","1","SEARCH TABLE nlink USING COVERING INDEX sqlite_autoindex_nlink_1 (neighbor_neighbor_id=? AND interfaces_intf_id=?)" 
+3

這個問題有點寬泛給出一個明確的答案。您可以開始運行'EXPLAIN QUERY PLAN'並查看查詢實際正在執行的操作。如果有太多的表掃描,你可能想要創建索引來加速它。 有關'EXPLAIN QUERY PLAN'的詳細信息,請參閱https://www.sqlite.org/eqp.html。 – Munir

+0

編輯問題以顯示此查詢的'EXPLAIN QUERY PLAN'的輸出。或者更好,也可以創建一個最小的[SQL小提琴](http://sqlfiddle.com/#!5),以便其他人可以測試查詢。 –

+0

謝謝你的提示。我將輸出添加到問題中。是否有任何選擇需要或輸出是否正常? – mspoerr

回答

2

可以嘗試創建於interfaces.macAddress索引並使用以下加入的查詢來代替?子查詢在這種情況下似乎較慢。

SELECT interface_RH.intf_id FROM interfaces AS interface_LH 
      INNER JOIN nlink ON nlink.interfaces_intf_id = interface_LH.intf_id 
      INNER JOIN neighbor ON nlink.neighbor_neighbor_id = neighbor.neighbor_id 
      INNER JOIN interfaces AS interface_RH ON interface_RH.macAddress = neighbor.l2_addr 
WHERE 
      interface_LH.intf_id=39151 
      AND interface_RH.status LIKE 'UP' 
      AND interface_RH.phl = 1 
      AND interface_RH.intf_id <> 39151 
      AND interface_RH.intfType = interface_LH.intfType