-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)

按顺序查询表达式。这些速度很慢,原因与 SELECT 列表中的子查询相同。在这种情况下,你实际上是在重新计算你已经拥有的值,所以你做了两次工作。您应该参考选择列表中的列。

3)

您查询跟踪表两次,一次是 track_mode = 'L',一次是 track_mode = 'C'。查询一次并根据 track_mode 的值计算两个计数会更有意义

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在子查询中使用了同一个表两次 - 您应该将子选择合并为一个并使用caseor if
如果您需要更多帮助,则必须运行Explain并向我们展示结果。

于 2012-08-22T05:41:20.450 回答