簡體   English   中英

MySQL-改善慢速子查詢的性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM