2016-12-30 8 views
1

では、私はLaravelプロジェクト関連するmysqlサブクエリを最適化するにはどうすればよいですか? laravel

1)車(ID、トークン、名前)

2)トラッキング(ID、car_id、緯度、LNG、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クエリを実行することをお勧めします。私はMAXGROUP BYだけでも、あなたがlast_timeindexを追加する必要があり、order byを使用して、偉大な、これを試すことはないと思います

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; 
+1

なぜJOINを試してみませんか。 –

答えて

4
は次のように参加にあなたのサブクエリ( O(n^2))を回し

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 
+0

これは正解ですが、SELECT ... DISTINCTよりもはるかに高速です。私はあなたが車1台につき1つの結果しか得ていないので、あなたがヌルの結果を期待しない限り、INNERの方が良いと指摘しています。 – joshstrike

+0

いいえ 'tracking'テーブルにレコードがない場合には' null'が必要です。 – GurV

+0

しかし、私にはこれは似ています。ビデオゲームのリーダーボード。したがって、結果を表示する必要がない場合は、INNER JOINとLIMIT 10のみを内側のクエリで使用するほうがはるかに高速になります。 – joshstrike

関連する問題