SELECT car_detail.*,
(SELECT Count(tdid)
FROM testdrive
WHERE testdrive.carid = car_detail.detail_id) AS vipdrive,
(SELECT Count(fid)
FROM finanace_app
WHERE finanace_app.classified_id = car_detail.detail_id) AS financeapp,
(SELECT Count(trid)
FROM tracking
WHERE tracking.carid = car_detail.detail_id
AND track_mode = 'C') AS craigimp,
(SELECT Count(trid)
FROM tracking
WHERE tracking.carid = car_detail.detail_id
AND track_mode = 'L') AS landing
FROM car_detail
WHERE year <= '2011'
AND price != '0'
AND photo_count != ''
ORDER BY (SELECT Count(tdid)
FROM testdrive
WHERE testdrive.carid = car_detail.detail_id)
+ (SELECT Count(fid)
FROM finanace_app
WHERE finanace_app.classified_id = car_detail.detail_id)
+ (SELECT Count(trid)
FROM tracking
WHERE tracking.carid = car_detail.detail_id)
+ car_detailed + picture_view + map_view
+ video_view DESC
2 に答える
改善できる点が 3 つあります。
1)
選択リスト内の相関サブクエリ。一般にサブクエリ、特に相関サブクエリは、メイン クエリの各行に対して実行されるため、低速です。これらを from 句のサブクエリに書き換えて結合することができます。
2)
order by のクエリ式。これらは、SELECT リストのサブクエリと同じ理由で低速です。この場合、実際には既に持っている値を再計算しているので、作業を 2 回行っています。代わりに、選択リストの列を参照する必要があります。
3)
track_mode = 'L' に対して 1 回、track_mode = 'C' に対して 1 回、トラッキング テーブルを 2 回クエリしています。一度クエリを実行し、track_mode の値に応じて 2 つのカウントを計算する方が理にかなっています。
SELECT car_detail.*
, vipdrive.testdrives
, financeapp.finance_count
, craigimp.tracking_count
, craigimp.landing_count
FROM car_detail
LEFT JOIN (
SELECT Count(tdid) testdrives
, testdrive.carid
FROM testdrive
GROUP BY testdrive.carid
) vipdrive
ON car_detail.detail_id = vipdrive.carid
LEFT JOIN (
SELECT Count(fid) finance_count
, finanace_app.classified_id
FROM finanace_app
GROUP BY finanace_app.classified_id
) financeapp
ON car_detail.detail_id = financeapp.classified_id
LEFT JOIN (
SELECT SUM(if(track_mode = 'C', 1, 0)) tracking_count
, SUM(if(track_mode = 'L', 1, 0)) landing_count
, tracking.carid
FROM tracking
GROUP BY tracking.carid
) craigimp
ON car_detail.detail_id = craigimp.carid
WHERE year <= 2011
AND price != 0
AND photo_count != ''
ORDER BY vipdrive.testdrives
+ finance_count
+ tracking_count
+ car_detailed + picture_view + map_view
+ video_view DESC
マイナーな改善点は、数値定数を引用していません。
パフォーマンスに関する質問の原則として、今後は次のことを行ってください。
- うまくフォーマットされたSQLを投稿してください。たとえば、このhttp://www.dpriver.com/pp/sqlformat.htm?ref=g_wangzを使用します
- クエリの各テーブルの SHOW CREATE TABLE 出力を投稿します
- クエリの EXPLAIN 出力を投稿します。
- 現在どのくらいの時間がかかっているか、どのくらい速くしたいかを書き留めてください。いつでも最適化できるので、目標が必要です。そうしないと、終わりのない練習になります。
個別に選択を実行してからorder by
、元のクエリで結果を使用してみてください。
また、サブクエリで同じテーブルtracking
を 2 回使用しています。サブセレクトを 1 つにマージし、case
orを使用する必要がありますif
。
それ以上のヘルプが必要な場合は、実行Explain
して結果を表示する必要があります。