![](/img/trans.png)
[英]Improving performance of MySQL query with a nested subquery with an IN clause
[英]MySQL - Improving performance of a slow subquery
我有一個大型的賽馬成績數據庫。 普通查詢的運行速度非常快,但是當使用子查詢時,性能會非常慢,甚至無法運行。
子查詢的目的是在比賽日期之前確定給定賽馬的結果。 因此,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
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
是否有多行具有相同的horse, raceref
組合? 如果是這樣, GROUP BY horse, raceref
將無法正常工作。
如果沒有公仔,則擺脫GROUP BY
; 它增加了工作而不改變結果。
我建議兩個索引: INDEX(horse, date)
對於子查詢很有用。 如果沒有GROUP BY
,則INDEX(raceref, horse)
對於ORDER BY
很有用。 如果您在那交換訂單,這對於GROUP BY
也很有用。
您絕對需要專欄horse
的索引。
您可以使用索引results(horse)
或索引results(horse, date, raceref)
。 后者可以完全覆蓋您的子查詢,並且可能會產生更好的結果,但是如果您發現有所不同,則取決於您的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.