在表'ttraces'中,我有許多不同任務的記錄(它們的值保存在'taskid'列中,並且是列的外鍵'id'在表'ttasks'中)。每個任務每8-10秒插入一個記錄,以緩存數據以提高性能並不是一個好主意。我需要的是僅從'ttraces'中爲每個任務選擇最新的記錄,這意味着具有列'time'最大值的記錄。目前,我在桌上有超過50萬條記錄。這兩個表的非常簡單的結構如下所示:MySQL:如何提高選擇查詢的速度,包含2個連接和1個子查詢
-----------------------
| ttasks |
-----------------------
| id | name | blocked |
-----------------------
---------------------
| ttraces |
---------------------
| id | taskid | time |
---------------------
我的查詢如下所示:
SELECT t.name,tr.time
FROM
ttraces tr
JOIN
ttasks t ON tr.itask = t.id
JOIN (
SELECT taskid, MAX(time) AS max_time
FROM ttraces
GROUP BY itask
) x ON tr.taskid = x.taskid AND tr.time = x.max_time
WHERE t.blocked
在所使用的所有列和JOIN子句的索引。至於查詢運行時間約爲1.5秒。提高速度至關重要。感謝您的所有建議。 BTW:數據庫運行在託管的共享服務器上,暫時我無法在其他地方移動它。
[編輯] EXPLAIN SELECT ...結果是:
--------------------------------------------------------------------------------------------------------------
id select_type table type possible_keys key key_len ref rows Extra
--------------------------------------------------------------------------------------------------------------
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 74
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 x.taskid 1 Using where
1 PRIMARY tr ref taskid,time time 9 x.max_time 1 Using where
2 DERIVED ttraces index NULL itask 5 NULL 570853
--------------------------------------------------------------------------------------------------------------
發動機是InnoDB的。謝謝。
'EXPLAIN'說什麼? – wroniasty
「在WHERE和JOIN子句中使用的所有列都被索引」 - >爲什麼你有一個被阻塞的索引?這是沒用的 – Cosmin
沒有'EXPLAIN'輸出,你沒有說什麼存儲引擎被使用,什麼MySQL設置等等。在共享服務器上運行數據庫是一個可怕的想法,你不能保證服務器將足夠的資源您的目的和數據庫匱乏,需要更多來自HDD子系統的IOPS。 –