我有一个大型赛马结果数据库。普通查询运行起来非常快,但是当使用子查询时,性能非常慢,以至于不可行。
子查询的目的是在比赛日期之前确定给定马匹的成绩。因此就有了 where 子句。
我想提高性能,据我了解,使用联接要快得多,但我无法让它成功工作。
我很想知道如何加入这个特定的查询?
很抱歉没有添加 SQL Fiddle,但是所需的数据量(即使对于示例而言)也太大了。
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
解释的输出:
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
最佳答案
是否有多个行具有horse、raceref
的相同组合?如果是这样,GROUP BY horse,raceref
将无法按预期工作。
如果没有重复项,则去掉GROUP BY
;它增加了工作量而不改变结果。
我推荐两个索引:INDEX(horse, date)
对于子查询很有用。如果没有 GROUP BY
,INDEX(raceref, horse)
对于 ORDER BY
很有用。如果您交换了其中的顺序,它对于 GROUP BY
也很有用。
关于MySQL - 提高慢速子查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37648198/