MySQL - 提高慢速子查询的性能

标签 mysql performance join

我有一个大型赛马结果数据库。普通查询运行起来非常快,但是当使用子查询时,性能非常慢,以至于不可行。

子查询的目的是在比赛日期之前确定给定马匹的成绩。因此就有了 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 BYINDEX(raceref, horse) 对于 ORDER BY 很有用。如果您交换了其中的顺序,它对于 GROUP BY 也很有用。

关于MySQL - 提高慢速子查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37648198/

相关文章:

mysql - SQL 两行合一

mysql - 将 MySQL 表从一台服务器导入到另一台服务器

php - mysql - 返回分组在列中的结果

java - EHCache 是如何实现它的事务的?

mysql - 在 MySQL 中通过 join 获取数据

mysql - 在这种情况下,GUID 是地址的良好引用键吗?

python - 如何提高 openpyxl 在单元格中写入值?

java - 为什么 Collections.synchronizedSet(HashSet) 对于 addAll、retainAll 和 contains 比 HashSet 更快?

Mysql查询根据最大顺序获取记录

mysql - Rails 中的嵌套连接