在MySQL中更新数千行的最快方法是什么

6 投票
2 回答
7469 浏览
提问于 2025-04-16 06:09
  • 假设你有一个包含100万行数据的表,而且这个表还在不断增加...
  • 每天每五分钟,你会运行一个Python程序,这个程序需要更新5万行的数据。

我想问的是:有什么最快的方法来完成这个工作呢?

  • 是先在循环中执行这些更新,等最后一个执行完后再提交所有更改?
  • 还是生成一个文件,然后通过命令行来运行它?
  • 创建一个临时表,通过快速插入大量数据,然后再对正式表进行一次更新?
  • 使用预处理语句?
  • 把更新分成每次1千条,这样可以生成更小的日志文件?
  • 在更新时关闭日志记录?
  • 或者在MySQL中使用案例(示例),但这种方法最多只能处理255行?

我不知道... 有没有人做过类似的事情?有什么最佳实践吗?我需要尽可能快地运行这个...

2 个回答

0

查询执行过程:服务器首先会解析你的查询,然后执行,你需要分析一下这个查询。

如果服务器解析的时间更短,那么执行的速度就会更快,而不是像其他方式那样慢。

4

这里有一些方法可以加快你的 UPDATES 操作。

当你进行 UPDATE 时,表中的记录其实是在用新数据重新写入。这在 INSERT 时也需要重复做一次。所以你应该始终使用 INSERT ... ON DUPLICATE KEY UPDATE,而不是 REPLACE

前者是在遇到键冲突时执行的 UPDATE 操作,而后者则是先 DELETEINSERT

举个例子,像这样 INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;。想了解更多,可以点击 这里

更新1:把所有的插入操作放在一个查询中是个好主意。这可以加快你的 UPDATES。关于如何做到这一点,可以查看 这里

更新2:现在我有机会看了你其他的问题。以下是我的一些了解:

  • 不要在循环中执行,尽量把所有的 UPDATE 操作放在一个 SQL 语句中,并且一次性提交。
  • 不确定这样做是否会有明显的效果,SQL 查询的优化更重要。
  • 这可以作为一个实验来尝试,进行基准测试。这个效果取决于你的 TABLEINDEXES 的大小,以及使用的 INNODB 还是 MYISAM
  • 对此我没有什么想法。
  • 参考第一点。
  • 是的,这可能会稍微加快你的操作。另外,看看你是否开启了 slow_query_log,这个功能会把所有慢查询记录到一个单独的日志文件中。也可以把这个功能关闭。
  • 再次提醒,参考第一点。

撰写回答