如何逐行从大表中获取数据

5w9g7ksd  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(427)

我需要从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
}

顺便说一句,分页要慢:/

nwwlzxa7

nwwlzxa71#

这个 fetchall_arrayref 方法接受两个参数,第二个参数允许您限制一次从表中获取的行数
下面的代码一次从表中读取1000行并处理每一行

my $sth = $dbh->prepare("SELECT * FROM table");
$sth->execute;

while ( my $chunk = $sth->fetchall_arrayref( undef, 1000 ) ) {

    last unless @$chunk;    # Empty array returned at end of table

    for my $row ( @$chunk ) {

        print format_row(@$row);
    }
}
bgtovc5b

bgtovc5b2#

在处理大型表时,我使用动态构建的sql语句构建数据包,如

$sql = "SELECT * FROM table WHERE id>" . $lastid . " ORDER BY id LIMIT " . $packagesize

应用程序将动态填充 $lastid 根据它处理的每个包。
如果 table 有一个id字段 id 它还有一个建立在该字段上的索引,因此性能非常好。
它还通过每个查询之间的少量休息来限制数据库负载。

wsxa1bj1

wsxa1bj13#

显然,查询的所有结果都存储在execute()命令之后的内存中
这是mysql客户机库的默认行为。您可以使用数据库或语句句柄上的mysql\u use\u result属性来禁用它。
请注意,当所有行都流式传输到客户机代码时,表上的读锁将保持更长的时间。如果这可能是一个问题,您可能需要使用sql\缓冲区\结果。

相关问题