>我正在使用一个MyISAM数据库,其中包含大约2200万行数据,我需要对其运行查询,但它太慢并且正在停止我的传入流量,我想避免这种情况。
我已经在我们的开发服务器上测试了查询,该服务器大约有 220 万行,这两个查询平均需要大约 3.7 秒:
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')
用这个解释:
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
谢谢!
也许?
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
如果您还没有,请尝试:
create index idx1 on analytics (timestamp,validate);
create index idx2 on game_sessions (token, solved);
请注意,仅"已解决"字段可能构成一个糟糕的索引,因为它看起来像一个布尔值。
问候