2014-11-03 72 views
0

我有一個相對簡單的查詢我試圖在表上運行:加快自加入SQL查詢

select distinct(a.question_id || a.app_name) 
from quick_stats a 
join quick_stats b on a.question_id = b.question_id 
        and a.app_name != b.app_name; 

不幸的是,查詢花費很長的時間來運行。

我認爲這是因爲表中有大約400萬條記錄,因爲它必須檢查表中每條記錄的每條記錄,這意味着有16萬億條檢查。

我該如何編寫這個查詢,所以它沒有做這麼多的檢查?

+1

h大家給表格添加索引 – Steve 2014-11-03 23:12:05

+0

在我看來,如果你已經在使用索引,並且沒有辦法可以添加「where」,那麼你可以做的事情就不多了。 – 2014-11-03 23:12:54

+0

我忘了問:你使用哪種存儲引擎?這也會影響您的選擇查詢的速度。 – kair 2014-11-03 23:23:55

回答

0

這主要是一個表設計問題。 檢查question_id和APP_NAME進行索引

請記住:你有更少的索引列,更好的性能 的索引存儲在指向您的數據庫全文進入一個額外的哈希表

這就是說:如果你有索引的question_id和app_name你的查詢在某種單獨的表中搜索,並且不必讀取所有列的全表

關於如何正確索引表的一個非常有用的源是:http://use-the-index-luke.com/welcome

+0

謝謝,我試圖實現這一點,但我不完全確定是否正確理解了這個建議。我還添加了一個名爲qid_and_app_name的新列,它等於id || app_name保存了一些額外的時間,並且我爲qid_and_app_name和question_id列創建了索引。然後,我將查詢更新爲以下內容: '從quick_stats中選擇distinct(a.qid_and_app_name)a 在a.qid_and_app_name = b.qid_and_app_name和a.question_id!= b.question_id;' 上加入quick_stats b但是它仍在運行大約10分鐘後。我做錯了什麼嗎? – user3476873 2014-11-04 00:17:56

+0

您可以將「SHOW INDEX FROM quick_stats」的結果添加到問題中嗎? – kair 2014-11-04 06:45:51