每次循环代码时都会发生多次更新。在撰写问题时,我从一张表中发现了80个单独的更新。
这需要10.8秒。如果我不进行更新(只将它们输出到屏幕以便我可以看到程序正在做什么),则需要2.7秒。 8秒钟锁定数据库的时间太长了:(
UPDATE的一个例子是
UPDATE players SET energy=energy+14 WHERE playerID=243 LIMIT 1
UPDATE players SET energy=energy+7 WHERE playerID=258 LIMIT 1
UPDATE players SET energy=energy+3986 WHERE playerID=244 LIMIT 1
UPDATE players SET energy=energy+2990 WHERE playerID=245 LIMIT 1
关于如何提高速度的任何想法?
答案 0 :(得分:2)
LIMIT 1
条款有什么好处?放弃它。
你有playerID
的索引吗?如果没有,请添加一个。
Players
表有多大?多少行?每一行有多大?
您是否考虑过准备好的UPDATE语句,该语句对操作进行参数化:
UPDATE Players SET Energy = Energy + ? WHERE PlayerID = ?
然后,您可以使用不同的参数多次执行此操作:
14 243
7 258
3986 244
2990 245
使用预准备语句的优点是DBMS不必每次都重新解析SQL,因此它的工作量较少。
答案 1 :(得分:1)
一个选项是确保在energy
行的播放器上没有任何索引,并确保在playerID
上有索引(索引会减少查找时间,但会增加更新/插入次)。
此外,我建议您阅读http://dev.mysql.com/doc/refman/5.0/en/update-speed.html了解一些想法。一个建议是尝试锁定表,更新所有内容,然后解锁。如果你给我一些关于你正在运行的MySQL版本(以及你正在使用的数据库/表格类型(MyIsam / InnoDB等))的更多信息,我可以帮助你。
我希望这有帮助!