我试图查询一个非常大的表,大约35+百万行处理每一行1 × 1,因为我不能在php中拉一次完整的数据库(内存不足),我在循环中使用'limit',但每次它试图查询700K标记它抛出一个磁盘空间不足的错误(错误28)
select * from dbm_new order by id asc limit 700000,10000
我一次拉入10K行到php,我甚至可以让它拉入100K行,它仍然抛出同样的错误,试图从700K行开始,我可以看到它正在消耗大量的磁盘空间。
在php中,我在每个循环后释放结果集
mysql_free_result ($res);
但这不是PHP相关的问题,我只在mysql中运行查询,它给出相同的错误
为什么从700K开始限制会占用这么多磁盘空间,我这里说的是47gig,当然它不需要那么多空间,我还有什么其他选择?
下面是代码
$start = 0;
$increment = 10000;
$hasResults = true;
while ($hasResults) {
$sql = "select * from dbm_new order by id asc limit $start,$increment ";
....
}
您可以使用PK而不是OFFSET
来获取数据块:
$start = 0;
while(1) {
$sql = "SELECT * FROM table WHERE id > $start ORDER BY id ASC LIMIT 10000";
//get records...
if(empty($rows)) break;
foreach($rows as $row) {
//do stuff...
$start = $row['id'];
}
}