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

时间:2012-05-28 15:35:49

标签: mysql sql perl cursor

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

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

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

这是Sequentially run through a MYSQL table with 1,000,000 records?中提到的方法。

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

1 个答案:

答案 0 :(得分:7)

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

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

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

如果永远不会更改id值,那么您可以安排将数据划分为可管理的子集,以便灵活定义“可管理”。

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