大数据集:带innodb的mysql_unbuffered_query?

时间:2012-04-21 16:24:43

标签: php mysql innodb myisam

基本上我需要对大数据集进行操作,所以我开始认为我可以使用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 个答案:

答案 0 :(得分:1)

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

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

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

相关问题