-3
 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  
4

2 に答える 2

1

改善できる点が 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 出力を投稿します。
  • 現在どのくらいの時間がかかっているか、どのくらい速くしたいかを書き留めてください。いつでも最適化できるので、目標が必要です。そうしないと、終わりのない練習になります。
于 2012-08-22T05:41:19.233 に答える
0

個別に選択を実行してからorder by、元のクエリで結果を使用してみてください。
また、サブクエリで同じテーブルtrackingを 2 回使用しています。サブセレクトを 1 つにマージし、caseorを使用する必要がありますif
それ以上のヘルプが必要な場合は、実行Explainして結果を表示する必要があります。

于 2012-08-22T05:41:20.450 に答える