我需要从mysql表中获取所有数据。到目前为止,我尝试的是:
my $query = $connection->prepare("select * from table");
$query->execute();
while (my @row=$query->fetchrow_array)
{
print format_row(@row);
}
但是总有一个但是。。。
表有大约6亿行,显然查询的所有结果都存储在内存中 execute()
命令。内存不足,无法执行此操作:(
我的问题是:
有没有一种方法可以使用perl dbi逐行从表中获取数据
my $query = $connection->prepare("select * from table");
while (my @row=$query->fetchrow_array)
{
#....do stuff
}
顺便说一句,分页要慢:/
3条答案
按热度按时间nwwlzxa71#
这个
fetchall_arrayref
方法接受两个参数,第二个参数允许您限制一次从表中获取的行数下面的代码一次从表中读取1000行并处理每一行
bgtovc5b2#
在处理大型表时,我使用动态构建的sql语句构建数据包,如
应用程序将动态填充
$lastid
根据它处理的每个包。如果
table
有一个id字段id
它还有一个建立在该字段上的索引,因此性能非常好。它还通过每个查询之间的少量休息来限制数据库负载。
wsxa1bj13#
显然,查询的所有结果都存储在execute()命令之后的内存中
这是mysql客户机库的默认行为。您可以使用数据库或语句句柄上的mysql\u use\u result属性来禁用它。
请注意,当所有行都流式传输到客户机代码时,表上的读锁将保持更长的时间。如果这可能是一个问题,您可能需要使用sql\缓冲区\结果。