2014-06-18 119 views
0

我試着讓導致下面的查詢,但其周圍2分鐘服用,以檢索的MySQL獲得最新的記錄,而不子查詢

SELECT * 
FROM customer e 
WHERE e.id=324 
AND e.g_id IN('x133fv','be6544','e992170','93611c') 
and e.enrol_id = 
(
select e1.enrol_id 
from customer e1 
WHERE e1.id=324 
AND e1.g_id=e.g_id 
ORDER BY update_time DESC, posted_time DESC, enrol_id DESC 
LIMIT 1 
) 

我有(G_ID,ID)指數

有通過JOIN獲得結果的任何其他方式?

+0

我和戈登在一起。不要尋找另一種方式。這個查詢看起來不錯,並且讀得很好如果時間太長,那麼您應該查看EXPLAIN計劃,並嘗試通過添加索引來查看它是否有效。既然你在id和g_id上有2個相等的條件,而在另外3個列上有一個順序,Gordon建議增加一個5列索引可能很好地解決你的問題。 – Frazz

+0

Frazz,戈登指數剛剛幫助我從總​​共2分鐘的輸出時間中獲得6秒。 :( – user3752021

回答

1

這是您的查詢:

SELECT * 
FROM customer e 
WHERE e.id = 324 AND 
     e.g_id IN ('x133fv','be6544','e992170','93611c') and 
     e.enrol_id = (select e1.enrol_id 
        from customer e1 
        WHERE e1.id=324 AND e1.g_id=e.g_id 
        ORDER BY update_time DESC, posted_time DESC, enrol_id DESC 
        LIMIT 1 
        ) 

可以改善索引性能。我會建議:customer(id, g_id, update_time, posted_time, enrol_id)

+0

感謝您的迴應...但是有可能得到一個JOIN而不是子查詢? – user3752021

+0

我加了這個索引,但仍然使用舊索引(g_id,id),也分析過幾次表,並且做了FORCE INDEX – user3752021

+0

@ user3752021 ...當我查看查詢時,只需要一個索引 –