加速MySQL查询,尝试了正常和连接 - 相同的速度



>我正在使用一个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);

请注意,仅"已解决"字段可能构成一个糟糕的索引,因为它看起来像一个布尔值。

问候

相关内容

  • 没有找到相关文章