2012-09-15 111 views
0

我有這個複雜的查詢,我需要優化。 沒有索引需要20ms,我試着添加一些索引,它更好,現在我有4ms。 但我沒有任何經驗。你能幫我把它變得更快嗎?如何優化索引sql查詢

SELECT COUNT(*) FROM(
    SELECT user_id FROM times 
     INNER JOIN tags ON times.user_id = tags.tag_id 
     INNER JOIN users ON tags.user_nr = users.nr 
     WHERE (times.time < 1597313) 
     AND (times.run_id="118") 
     AND (times.user_id != 109330258) 
     AND (times.user_id != 0) 
     AND (times.time != 0) 
     AND (times.cell != 1) 
     AND (users.category_id="4") 
     GROUP BY user_id HAVING count(*) == 1 
    UNION 
    SELECT user_id FROM times 
    INNER JOIN tags ON times.user_id = tags.tag_id 
    INNER JOIN users ON tags.user_nr = users.nr 
    WHERE (times.run_id="118") 
    AND (times.user_id != 109330258) 
    AND (times.user_id != 0) 
    AND (times.time != 0) AND (times.cell != 1) 
    AND (users.category_id="4") 
    GROUP BY user_id HAVING count(*) > 1 
    ) 

我增加了3個索引。

  • 表標籤 - 標籤識別
  • 表倍 - user_id說明
  • 表用戶 - NR
+1

是MySQL還是SQLite?你標記爲 – pickypg

+0

「更好,現在我需要4ms」。現在多少錢?你在這些表中有多少數據?你是如何確定要添加哪些索引的?查詢計劃(解釋)是什麼樣的? – Oded

+0

其sqlite(標記刪除),現在我有4毫秒(編輯) – Meloun

回答

0

你也應該嘗試索引tags.user_nr,但它不可能給出一個明確的答案,而不會看到查詢計劃。