2014-01-14 18 views
0

我正在使用一個MyISAM數據庫中有大約2200萬行數據,我需要運行一個查詢,但它太慢了,是阻止我傳入的流量,這是我想避免的。加快MySQL查詢,嘗試普通和加入 - 同速

我已經測試了我們的開發服務器,它擁有約220萬行的查詢,大約需要3.7秒平均爲這兩個查詢:EXPLAIN

SELECT DISTINCT gg.token 
FROM analytics aa 
JOIN game_sessions gg 
ON aa.session_token = gg.token 
AND aa.timestamp > '2013-10-20 00:00:00' 
and aa.action = "validate" 
and gg.solved = 1 

有了這個:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE aa ALL session_token NULL NULL NULL 12317871 Using where; Using temporary 
1 SIMPLE gg ref token token 23 fc.aa.session_token 1 Using where 

我也試過以下給出了相同的結果:

select DISTINCT gg.token 
from analytics aa, game_sessions gg 
where aa.session_token = gg.token 
and aa.action = "validate" 
and gg.solved = 1 
and gg.timestamp >= STR_TO_DATE('10/20/2013', '%m/%d/%Y') 

有了這個E XPLAIN:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE aa ALL session_token NULL NULL NULL 12317913 Using where; Using temporary 
1 SIMPLE gg ref token token 23 fc.aa.session_token 1 Using where 

他們都需要約3.7秒,理想的情況是我能做出這麼多,速度更快,所以我可以用我的產品數據庫。有什麼明顯的我失蹤?

索引:game_sessions上的'token'和分析上的'session_token'相同。

編輯:gg.solved爲int(11),gg.action爲VARCHAR(100),gg.timestamp是TIMESTAMP

謝謝!

+0

你對查詢做了EXPLAIN嗎? –

+1

你不應該看着做一個LEFT JOIN而不是默認的OUTER JOIN嗎? –

+0

所以你沒有索引'aa.timestamp','aa.action'或'gg.solved'? (這些具體的字段類型是什麼?) –

回答

0

也許?

SELECT DISTINCT gg.token 
    FROM game_sessions gg 
    LEFT JOIN analytics aa 
    ON aa.session_token = gg.token 
    WHERE aa.timestamp > '2013-10-20 00:00:00' 
    AND aa.action = "validate" 
AND gg.solved = 1 
+0

這裏還是3.7秒。也許這和它一樣好? –

+0

幾乎相同的查詢如此...沒有索引,很多行很難。 – NewInTheBusiness

0

如果你還沒有,請嘗試:

create index idx1 on analytics (timestamp,validate); 
create index idx2 on game_sessions (token, solved); 

注意現場「解決」可能單獨組成一個蹩腳的指標,因爲它似乎是一個布爾值。

問候,