2013-02-08 61 views
1

我想從下面的查詢中顯示一些有限的記錄,但我應該如何減少在查詢中使用連接執行的掃描的總數並使執行速度更快?如何減少mysql查詢中的掃描總數?

查詢::

select ml.*,m.title as medianame,mt.name as media_type,d.device_name as devicename, 
SUBTIME(ml.end_time,ml.start_time) as playback_duration,d.client_id 
from device_media_log ml left join media m on m.media_id = ml.media_id left join device d on d.device_id = ml.device_id 
left join media_type mt on m.media_type_id = mt.media_type_id 
order by ml.play_date desc,ml.start_time desc,ml.end_time desc; 

所有表包含所需的索引。

+0

你真的需要從四個表中獲取所有數據嗎?任何條件下,分頁!? – ravnur

+0

不,我需要根據連接僅從device_media_log表中獲取所有數據。 –

+0

這裏應該如何使用分頁?它應該做什麼不同? –

回答

0

我推薦的最好的方法是在可能的地方使用where子句。

select ml。*,m.title as medianame,mt.name as media_type,d.device_name as devicename,SUBTIME(ml.end_time,ml.start_time)as playback_duration,d.client_id from device_media_log ml left join media m on m.media_id = ml.media_id left加入設備d on d.device_id = ml.device_id left join media_type mt on m.media_type_id = mt.media_type_id WHERE SOMETHING = SOMETHING AND SOMETHING = SOMETHING order by ml.play_date desc,ml.start_time desc,ml.end_time desc;

+0

哪裏條款還存在一些問題。 Mmeory在提取數據時發現錯誤。 –

+0

您是否使用此查詢運行EXPLAIN以查看需要更多時間的內容。當你說內存枯竭時,我認爲你可能會得到一個大的結果集。 –

+0

是的,我解釋了這一點。所有表只讀取單行,但device_media_log讀取大約300萬行。我應該如何減少? –