mysql - 加速 perl DBI fetchrow_hashref

标签 mysql sql database performance perl

我有一些看起来像这样的东西:

my $report = new ReportGenerator; #custom object
my $dbh = $dbc->prepare('SELECT * FROM some_table WHERE some_condition'); #DBI handle
$dbh->execute();
while(my $href = $dbh->fetchrow_hashref){
    $report->process_record($href);
}
$dbh->finish();
print $report->printReport();

我的问题是循环的每次迭代都非常慢。问题是MySQL。我想知道是否有可能在 while 循环中放置某种包装器以使其一次获取多个记录,与此同时,将所有记录获取到内存中也不实用。我不担心代码的效率(hashref 与 arrayref 等)。相反,我有兴趣一次获取 10000 条记录。

数据库有大约 500 万条记录。我无法更改/升级服务器。

谢谢

最佳答案

您可以使用接受“maxrows”参数的 fetchall_arrayref 函数:

while (my $data = $dbc->fetchall_arrayref(undef, 10000)) {
  for my $row( @{$data} ) {
    $report->process_record($row);
  }
}

您还可以查看 RowCacheSize该属性试图控制从您的驱动程序获取的数据中返回的记录数。

关于mysql - 加速 perl DBI fetchrow_hashref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605322/

相关文章:

php - PHP 中 MySQL 查询的返回值

php - 子查询 : select from one table based on matching user ids with team ids and output 2 dimensional array

mysql - 如何启动具有特定增量值的mysql列?

sql - 比较两个表,如果不存在更新或插入

mysql - 比较从最早的列开始的列值,直到它们的总和等于一个数字

mysql - 我无法锁定我的 MySQL 表

javascript - 在 Javascript 中生成唯一 ID

mysql - 循环遍历 AJAX 结果并发布到 HTML,

php - 如何更改 mysql 和 php 中的表列?

mysql - 将两行合二为一 - Mysql