2011-08-03 54 views
1

我有多個包含管視頻信息的表。我需要加入這三個表格並獲取所需的列,然後按最近的時間(unix timestamp)對其進行排序。該視頻專欄有120萬條記錄,video_data有800多萬條記錄,Tube僅有22條記錄。MySQL ORDER BY殺死我的SQL查詢

此查詢工作正常沒有ORDER BY部分:

SELECT vd.video_id,vd.tube_id,V *,t.tube_title,t.tube_domain FROM video_data VD JOIN視頻V ON VD。 VIDEO_ID = v.video_id JOIN管t ON vd.tube_id = t.tube_id LIMIT 100

上述查詢了0.0002秒

然而,一旦我想按時間戳排序,如果服務器未首先重置,則需要4-5分鐘才能運行。

SELECT vd.video_id,vd.tube_id,V *,t.tube_title,t.tube_domain FROM video_data VD JOIN視頻V ON vd.video_id = v.video_id JOIN管t ON vd.tube_id = t.tube_id ORDER BY v.date_timestamp DESC LIMIT 100

上述查詢了272.9157秒

我增加了一個索引到v.date_timestamp場,看看是否會有所幫助,但顯然它不是。也許把這個專欄的索引毫無意義?任何幫助將是偉大的,我還是相當新的SQL ...

+0

嘗試SELECT ... FROM video_data JOIN視頻v USE INDEX(your_index)... – Zaffy

回答

0

並不積極,但我相信這個問題可能是,當你有video.date_timestamp索引,查詢必須先打每一個video_data進入連接成視頻。

你應該去看看正常化大的提速如下:date_timestamp場複製到video_data表和排序索引/那不是相當於一個視頻。

+0

我懷疑它可能是這樣的,我會試試看看會發生什麼。 – Chris

+0

這很好,查詢花費了0.0002秒...現在,它的運行速度與我的SQL一樣快,並且根本沒有ORDER BY。謝謝! – Chris

+0

爲他人蔘考,我最後的SQL:SELECT DISTINCT vd.video_id,vd.tube_id,vd.date_timestamp,V *,t.tube_title,t.tube_domain FROM video_data VD JOIN視頻V ON vd.video_id = v.video_id JOIN管T ON vd.tube_id = t.tube_id ORDER BY vd.date_timestamp DESC LIMIT 100 – Chris

0

首先,我認爲,如果你用DESC你的指數是無用的 - 至少我已經看到了這樣的聲明。

無論如何,你可以考慮做這樣的事情:

SELECT ... FROM(SELECT VIDEO_ID,tube_id FROM video_data ORDER BY時間戳LIMIT 100)VD INNER JOIN ...

也許會更快。事情的關鍵是限制100 :)

0

重新做的是加入使最小表至上 - 這是一個很好的習慣。

SELECT vd.video_id, vd.tube_id, v.*, t.tube_title, t.tube_domain 
FROM tube t 
INNER JOIN video_data vd 
    ON vd.tube_id = t.tube_id 
INNER JOIN video v 
    ON v.video_id = vd.video_id 
ORDER BY v.date_timestamp DESC LIMIT 100 

我敢打賭,這將幫助,因爲視頻數據將不會被加載,直到22個記錄都在,所以總的結果集就會小很多。 此外,如果這是你的意圖,很好地顯示內部聯接。

+0

似乎沒有工作.... 「錯誤101(淨:: ERR_CONNECTION_RESET):連接被重置」。 – Chris

+0

這是一個奇怪的錯誤,聽起來更像是一個普遍的連接問題。你用什麼工具來測試你的查詢?我經常使用ExecuteQuery,這很不錯。 –

+0

我使用phpmyadmin,也許很快我就會離開我的「初學者」狀態並開始探索其他工具。 – Chris