如何内存高效地处理MySQL表的所有行?

Eri*_*ric 1 mysql sql perl cursor

我有一个拥有2.37亿行的MySQL表.我想处理所有这些行并使用新值更新它们.

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

where id = '1'
where id = '2'
Run Code Online (Sandbox Code Playgroud)

这是顺序运行一个包含1,000,000条记录的MYSQL表中提到的方法.

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

Jon*_*ler 7

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

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

  • DBMS能否确定新值应该是什么?
  • 您是否可以将必要的数据导入数据库,以便DBMS可以确定新值应该是什么?
  • 237万行中的每一行都会被更改,还是只有一部分?
  • DBMS可以用来确定子集吗?
  • 是否会id改变任何值?

如果id永远不会更改这些值,那么您可以安排将数据划分为可管理的子集,以便对"可管理"的任何灵活定义.

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