我有一个拥有2.37亿行的MySQL表。我想处理所有这些行并使用新值更新它们。
我确实有顺序ID,所以我可以使用很多select
语句:
where id = '1'
where id = '2'
这是Sequentially run through a MYSQL table with 1,000,000 records?中提到的方法。
但是我想知道是否有更快的方法使用类似游标的东西,用于顺序读取大文件而无需将整个集合加载到内存中。我看到它的方式,游标比运行数百万select
语句要快得多,以便以可管理的块恢复数据。
答案 0 :(得分:7)
理想情况下,您可以让DBMS为您完成工作。您创建SQL语句,使其仅在数据库中运行,而不是将数据返回到应用程序。除此之外,这可以节省2.37亿条消息到客户端的开销,以及2.37亿条消息返回服务器。
这是否可行取决于更新的性质:
id
值?如果永远不会更改id
值,那么您可以安排将数据划分为可管理的子集,以便灵活定义“可管理”。
您可能需要考虑交易边界;这一切都可以在一次交易中完成而不会破坏日志吗?如果您在子集中进行操作而不是单个原子事务,如果您的驱动过程在处理的1.97亿行崩溃,您会怎么做?或者DBMS在那时崩溃了?您如何知道在何处恢复操作以完成处理?