大型数据集: 在innodb中使用mysql_unbuffered_query?

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");
}
1个回答

1
你无法运行另一个查询的原因是查询结果没有预取,而且你正在处理游标。不过,你可以打开另一个连接以处理其他查询。
请记住,在MySQL中有几个设置影响查询执行后连接保持开放的时间,如果数据集很大,服务器可能会在你处理查询之前关闭连接(请参阅wait_timeout和net_write_timeout)。
一个好的替代方法是在循环中执行查询,限制行数,并使用WHERE pk > value ORDER BY pk ASC,其中pk是主键,value是从上一个查询中检索到的最后一个值(如果仅实现limit、offset,则在大偏移量上性能将下降)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接