1

我有一个包含 2.37 亿行的 MySQL 表。我想处理所有这些行并用新值更新它们。

我确实有顺序 ID,所以我可以使用很多select语句:

where id = '1'
where id = '2'

这就是顺序运行100万条记录的MYSQL表中提到的方法吗?.

但是我想知道是否有一种更快的方法使用像游标这样的东西来顺序读取一个大文件,而无需将整个文件集加载到内存中。select在我看来,游标比运行数百万条语句以将数据恢复为可管理的块要快得多。

4

1 回答 1

7

理想情况下,您可以让 DBMS 为您完成工作。您创建 SQL 语句,使其仅在数据库中运行,而不向应用程序返回数据。除此之外,这节省了发送给客户端的 2.37 亿条消息和返回服务器的 2.37 亿条消息的开销。

这是否可行取决于更新的性质:

  • DBMS 能否确定新值应该是什么?
  • 您能否将必要的数据输入数据库,以便 DBMS 可以确定新值应该是什么?
  • 会更改 2.37 亿行中的每一行,还是只更改一个子集?
  • DBMS 可以用来确定子集吗?
  • id是否会更改任何值?

如果这些id值永远不会改变,那么您可以安排将数据划分为可管理的子集,以实现“可管理”的任何灵活定义。

您可能需要考虑事务边界;可以在一个事务中完成所有操作而不会破坏日志吗?如果你在子集中进行操作而不是作为单个原子事务,如果你的驱动进程在处理 1.97 亿行时崩溃,你会怎么做?或者 DBMS 在那个时候崩溃了?您如何知道在哪里恢复操作以完成处理?

于 2012-05-28T17:25:22.730 回答