基本上,我需要对大数据集进行操作,所以我开始考虑可以使用mysql_unbuffered_query来避免将所有结果加载到内存中。
但是我读到,当我读取行时,我不能在同一个表上运行任何其他查询。我想知道,如果桌子是清白的,这仍然是正确的吗?
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");
}
发布于 2012-04-21 18:08:08
不能运行另一个查询的原因是查询的结果没有被预取,而您正在处理游标。不过,您可以打开另一个连接来处理其他查询。
请记住,MySQL中有几个设置会影响查询执行后连接保持打开的时间,如果数据集很大,则服务器可以在您处理查询之前关闭连接(请参见wait_timeout和net_write_timeout)
一个好的选择是在循环中执行查询,限制行数,并使用WHERE pk > value ORDER BY pk ASC
,其中pk
是主键,value
是从前一个查询中检索到的最后一个值(就像您实现的只是limit,offset,如果偏移量很大,性能将会下降)
https://stackoverflow.com/questions/10260819
复制