我有一个庞大的赛马结果数据库。普通查询的运行速度非常快,但是在使用子查询时,性能非常慢到达不可行的程度。
子查询的目的是在比赛日期之前确定给定马的结果。因此where子句。
我想提高性能,据我所知,使用连接速度要快得多,但是我无法让它成功运行。
我很想知道如何加入这个特定的查询?
我为没有添加SQL小提琴而道歉,但是,即使是样本,所需数据的庞大规模也太大了。
select date, raceref, horse, rank,
(
SELECT ifnull(count(raceref),0)
FROM results
WHERE horse = t.horse
AND date < t.date
) AS totalracesprior,
FROM results t
group by horse, raceref
order by raceref, horse
EXPLAIN的输出:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t ALL NULL NULL NULL NULL 110088 Using where; Using temporary; Using filesort
2 DEPENDENT SUBQUERY results ALL NULL NULL NULL NULL 110088 Using where
索引:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
results 0 PRIMARY 1 id A 110088 NULL NULL BTREE
答案 0 :(得分:1)
horse, raceref
的相同组合是否有多行?如果是这样,GROUP BY horse, raceref
将无法按预期工作。
如果没有重复,那么摆脱GROUP BY
;它增加了工作而不改变结果。
我建议使用两个索引:INDEX(horse, date)
对子查询很有用。如果没有GROUP BY
,则INDEX(raceref, horse)
对ORDER BY
非常有用。如果您在那里交换订单,它对GROUP BY
也很有用。
答案 1 :(得分:0)
您绝对需要列horse
的索引。
您可以使用索引results(horse)
或索引results(horse, date, raceref)
。后者将提供对子查询的完全覆盖,并可能产生更好的结果,但如果你看到差异,它将取决于你的数据。