MySQL - 提高慢子查询的性能

时间:2016-06-06 00:46:12

标签: mysql performance join

我有一个庞大的赛马结果数据库。普通查询的运行速度非常快,但是在使用子查询时,性能非常慢到达不可行的程度。

子查询的目的是在比赛日期之前确定给定马的结果。因此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       

2 个答案:

答案 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)。后者将提供对子查询的完全覆盖,并可能产生更好的结果,但如果你看到差异,它将取决于你的数据。