大型数据集:mysql_unbuffered_query与innodb


Large datasets: mysql_unbuffered_query with innodb?

基本上我需要对大数据集进行操作,所以我开始考虑我可以使用mysql_unbuffered_query来不将所有结果加载到 RAM 中。

但是我读到,当我获取行时,我无法在同一表上运行任何其他查询。我想知道如果表是 innodb,这仍然是真的吗?

Innodb在执行mysql_unbuffered_query时是否使用行级锁定?

伪代码为:

$q = mysql_unbuffered_query("SELECT * FROM largeTable");
while($r = fetch($q)) {
 if (some condition)
   mysql_query("UPDATE largeTable SET field = somevalue WHERE id = someid");
}

无法运行其他查询的原因是查询结果未预取,并且您正在处理游标。不过,您可以打开另一个连接来处理其他查询。

请记住,MySQL 中有几个设置,会影响执行查询后连接保持打开状态的时间,如果数据集很大,服务器可以在您处理查询之前关闭连接(请参阅wait_timeout和net_write_timeout)

好的替代方案是在循环中执行查询,限制行数,并使用WHERE pk > value ORDER BY pk ASC,其中pk是主键,并value从上一个查询中检索到的最后一个值(就像你只实现限制一样,偏移量在大偏移量上性能会下降)