不久前,我在一个特定的查询方面得到了一些帮助。下面是链接:在新列中使用字符串的SQL组
我的查询看起来类似于以下内容:
SELECT event_data, class_40_winner, class_30_winner
FROM events e
LEFT JOIN (SELECT result_event, name AS class_40_winner
FROM results
WHERE class = 40 AND position = 1) c40 ON e.id = c40.result_event
LEFT JOIN (SELECT result_event, name AS class_30_winner
FROM results
WHERE class = 30 AND position = 1) c30 ON e.id = c30.result_event我现在已经在我的数据库中输入了足够的数据(22,000行),这个查询需要超过6秒才能完成。(我的实际查询比上面的查询要大,因为它现在有4个联接。)
我在查询中使用了“解释”函数来查看。“结果”表中的每个查询都会拖进22,000行,因此这似乎就是问题所在。
我已经做了一些研究,听起来我应该能够索引“结果”表上的相关列,以帮助加快速度。但是当我这样做的时候,它实际上把我的查询速度降低到了10秒左右。
对于我能做些什么来改进这个查询有什么建议吗?
发布于 2017-01-14 09:21:51
AFAIK,您正在旋转数据,我认为使用max(case ...) ... group by在旋转数据方面具有良好的性能。
我可以建议您使用以下查询:
select event_date
, max(case when r.class = 40 then name end) `Class 40 Winner`
, max(case when r.class = 30 then name end) `Class 30 Winner`
from events e
left join results r on e.event_id = r.result_event and r.position = 1
group by event_date;[SQL Fiddle演示]
发布于 2017-01-14 07:21:49
请尝试以下查询:
SELECT
e.event_date,
r1.name as class_40_winner,
r2.name as class_30_winner
FROM
events e,
results r1,
results r2
WHERE
r1.class = 40 AND
r2.class = 30 AND
r1.position = 1 AND
r2.position = 1 AND
r1.result_event = e.id AND
r2.result_event = e.id发布于 2017-01-14 07:33:26
SELECT e.event_data
, r.class
, r.name winner
FROM events e
JOIN results r
ON r.result_event = e.id
WHERE class IN (30,40)
AND position = 1这个问题的其余部分是一个简单的显示问题,最好在应用程序代码中解决。
https://stackoverflow.com/questions/41647621
复制相似问题