在自联接表上删除时性能下降

时间:2014-08-16 02:32:24

标签: php mysql

我有一台MySQL服务器通过AJAX处理程序从游戏中接收数据,偶尔在最好的努力下,行会在INSERT期间以某种方式最终重复复制。我有一个解决方案,在INSERT完成后立即删除它们,并且当我在DB中只有几千行时它工作正常。现在我有一百万行,在高峰时间这个查询需要大约40秒才能运行,并且它们会在每次游戏结束后被堆积起来(现在是高峰时间我每分钟会得到3到4个新游戏) ),并且在删除运行时服务器不回答任何其他查询。

$removedupes = query("DELETE g1 FROM games g1, games g2 WHERE g1.name=g2.name AND g1.gameno=g2.gameno AND g1.score=g2.score AND g1.id > g2.id AND g1.gameno=".$lastgame);

当我解释查询时,似乎没有使用任何键或索引,并且当它只需要查看最多30个时,它必须检查所有百万行。

EXPLAIN DELETE g1 FROM games g1, games g2 WHERE g1.name=g2.name AND g1.gameno=g2.gameno AND g1.score=g2.score AND g1.id > g2.id AND g1.gameno=101010
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE g1 ALL PRIMARY,name,name_2,cleanup NULL NULL NULL 1045764 Using where
1 SIMPLE g2 ref PRIMARY,name,name_2,cleanup cleanup 53 dbname.g1.name,const,dbname.g1.score 1 Using where; Using index

我已经尝试过先选择,但即使强制使用新索引,在加载过程中性能也非常糟糕。非高峰时间运行需要2-8秒。我已经尝试构建查询以将该游戏放入临时表但我还没有找到正确的语法。任何帮助将不胜感激。

0 个答案:

没有答案