我正在使用一個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
謝謝!
你對查詢做了EXPLAIN嗎? –
你不應該看着做一個LEFT JOIN而不是默認的OUTER JOIN嗎? –
所以你沒有索引'aa.timestamp','aa.action'或'gg.solved'? (這些具體的字段類型是什麼?) –