2016-12-30 54 views
1

我在Laravel項目如何優化相關的mysql子查詢?在laravel

1)汽車(ID,令牌名)

2)跟蹤(ID,car_id,緯度,經度,point_time)

跟蹤表2個表包含汽車的所有GSP數據幷包含大量數據!

我需要獲取每輛車的最後一個跟蹤數據。

SELECT distinct `a`.`id` , 
       (SELECT MAX(`tracking`.`point_time`) 
       FROM `tracking` 
       WHERE tracking.car_id = a.id) as `last_time` 
FROM `cars` AS `a` 

現在,這個查詢工作正常,但大約需要4秒鐘執行!

我需要一個替換查詢才能運行得更快。

我更喜歡執行一個原始的sql查詢來執行速度更快,如上所見。

+1

爲什麼不試試JOIN。 –

回答

4

把你的子查詢(O(n^2))爲加入這樣的:

select c.id, 
    t.`last_time` 
from `cars` c 
left outer join (
    select car_id, 
     MAX(t.`point_time`) `last_time` 
    from `tracking` t 
    group by car_id 
    ) t on c.id = t.car_id; 
+0

這是正確的答案,比SELECT ... DISTINCT快得多。我只想指出,由於每輛車只能獲得一個結果,因此除非您期望得到空結果,否則您最好使用INNER連接。 – joshstrike

+0

不需要。如果'tracking'表中沒有記錄,我希望'null'。 – GurV

+0

當然。但對我而言,這類似於例如視頻遊戲的排行榜。因此,如果您不需要顯示任何空結果,那麼在內部查詢中只使用INNER JOIN和LIMIT 10會更快。 – joshstrike

0

我不認爲MAXGROUP BY是偉大的,只是用order by,你也應該在:LAST_TIMEBREAK添加index,試試這個:

SELECT DISTINCT r.* 
FROM 
( 
    SELECT c.id, t.last_time 
    FROM cars AS c 
    LEFT JOIN tracking as t 
    ON t.car_id = c.id 
    ORDER BY c.id, t.last_time DESC 
) AS r