2014-12-29 85 views
0

我的表剛剛有超過15百萬行。 我需要運行這樣的查詢:使用IN子句和子查詢進行極端查詢優化

SELECT ch1.* FROM citizens_dynamic ch1 
WHERE ch1.id IN (4369943, ..., 4383420, 4383700) 
AND ch1.update_id_to = (
    SELECT MAX(ch2.update_id_to) 
    FROM citizens_dynamic ch2 
    WHERE ch1.id = ch2.id AND ch2.update_id_to < 812 
) 

基本上,在IN條款每個公民將搜索與最接近的一排,但比指定update_id_to低。

2列第update_id_to, id列有PRIMARY鍵。 目前,此查詢在0.9s內執行(IN子句中有100個ID)。 它仍然太慢,我需要運行腳本3天才能完成。

下面你可以看到我的EXPLAIN輸出。 phpmyadmin explain output

id指數就像是主鍵,但逆轉列:id, update_id_to

你有什麼想法如何使它更快?

回答

1

我發現MySQL的JOIN性能往往比相關的子查詢更好。

SELECT ch1.* 
FROM citizens_dynamic AS ch1 
JOIN (SELECT id, MAX(update_id_to) AS update_id_to 
     FROM citizens_dynamic 
     WHERE id IN (4369943, ..., 4383420, 4383700) 
     GROUP BY id) AS ch2 
    ON ch1.id = ch2.id 
WHERE ch1.id IN (4369943, ..., 4383420, 4383700) 

而且,看到在這個問題上的其他方法:

Retrieving the last record in each group