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
问问题
178 次
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
在子查询中使用了同一个表两次 - 您应该将子选择合并为一个并使用case
or if
。
如果您需要更多帮助,则必须运行Explain
并向我们展示结果。
于 2012-08-22T05:41:20.450 回答