在Yii2中循环访问大量数据库行

在Yii2中循环访问大量数据库行,yii,yii2,Yii,Yii2,我使用的是Yii2,我的数据库服务器是MySQL。我需要扫描整个db表中的每一行,搜索某些文本的出现 这正是我想要的,但由于记录太多,我不确定是否这样做服务器不会耗尽内存或MySQL服务器不会消失: $rows = Posts::find()->select('content')->all(); foreach($rows as $post) { // do some regex on $post['content']. no need to save it back to

我使用的是Yii2,我的数据库服务器是MySQL。我需要扫描整个db表中的每一行,搜索某些文本的出现

这正是我想要的,但由于记录太多,我不确定是否这样做服务器不会耗尽内存或MySQL服务器不会消失:

$rows = Posts::find()->select('content')->all();
foreach($rows as $post) {
    // do some regex on $post['content']. no need to save it back to the table.
}
这是一个带有大型数据库的实时服务器。我必须在运行中完成,不能关闭服务器进行备份和恢复


这样行吗?有没有更好的办法

Yii2指南中的以下两个小节讨论了您的问题:

  • 检索数组中的数据

    use yii\helpers\ArrayHelper;
    $contents = ArrayHelper::getColumn(
      Post::find()->asArray()->all(),
      'content'
    );
    foreach ($contents as $content) {
    
    }
    
  • 批量检索数据

    // fetch 10 rows at a time
    foreach(Posts::find()->select('content')->each(10) as $post) {
        // ...
    }
    

这两种方法都可以降低内存成本。

Yii2指南中的以下两个小节讨论了您的问题:

  • 检索数组中的数据

    use yii\helpers\ArrayHelper;
    $contents = ArrayHelper::getColumn(
      Post::find()->asArray()->all(),
      'content'
    );
    foreach ($contents as $content) {
    
    }
    
  • 批量检索数据

    // fetch 10 rows at a time
    foreach(Posts::find()->select('content')->each(10) as $post) {
        // ...
    }
    

这两种方法都可以降低内存成本。

使用后台处理。在yii2中,请查看控制台应用程序的文档,而不是在记录中循环(这可能会导致内存问题),您只需在查询中使用REGEXP……因为我需要从字段中提取匹配的模式,并且我不清楚如何在MySQL中执行,所以我宁愿使用Yii“batch”或“each”方法。这似乎奏效了。谢谢。为什么不使用查询生成器呢?请转到后台处理。在yii2中,请查看控制台应用程序的文档,而不是在记录中循环(这可能会导致内存问题),您只需在查询中使用REGEXP……因为我需要从字段中提取匹配的模式,并且我不清楚如何在MySQL中执行,所以我宁愿使用Yii“batch”或“each”方法。这似乎奏效了。无论如何,谢谢。为什么不使用查询生成器呢?