4

基本上我需要对大数据集进行操作,所以我开始认为我可以使用 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");
}
4

1 回答 1

1

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

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

好的选择是在循环中执行查询,限制行数,并使用WHERE pk > value ORDER BY pk ASC, wherepk是主键,以及value从前一个查询中检索到的最后一个值(就像你只实现 limit,offset 一样,性能会在大偏移量)

于 2012-04-21T18:08:07.657 回答