antevenio/pdo-mysql-select-iterator

使用LIMIT子句实现的PHP PDO Mysql选择语句迭代器

0.1.14 2023-04-18 14:49 UTC

README

Latest Stable Version Total Downloads License Build Status Code Climate

使用LIMIT子句实现的PHP PDO Mysql选择语句迭代器。

这是什么

因此,您希望迭代通过某些MySQL选择查询得到的数百万行表数据,因为您想对他们做些事情,但是,遗憾的是,您可爱的数据库管理员不喜欢在服务器上运行时间太长的查询,更糟糕的是,服务器本身无法处理它们!我们该怎么办?我们发出多个查询,每次获取较小的行块。

这是一个基于此概念的PHP迭代器。在接收到SELECT查询和PDO数据库连接后,构建一个迭代器,这样您可以无缝地遍历结果,而无需担心其他任何事情。

安装

使用composer添加依赖项

composer require antevenio/pdo-mysql-select-iterator

使用示例

<?php
$pdo = new PDO('mysql:host=localhost;dbname=kidsshouting', 'myuser', 'mypass');
$iterator = (new \PdoMysqlSelectIterator\Factory())
    ->create($pdo, "select a,b from tbl order by a", 1000);
// Get a total row count from the query if needed
$total = count($iterator);
foreach ($iterator as $item) {
    // Do your stuff with $item
}

注意

工厂会在非"select"查询时抛出InvalidQueryException异常。

工厂只有在以下条件下才会返回LimitIterator:

  • blockSize > 0
  • 查询包含"order by"子句
  • 查询没有使用任何"rand()"函数

如果上述任一条件不满足,工厂将返回一个非limit的迭代器,称为"NativePDOIterator"。

为了确保结果的一致性,您可能需要在数据库事务中获取整个迭代和计数。最适合的隔离级别是REPEATABLE-READ。

https://dev.mysqlserver.cn/doc/refman/5.7/en/innodb-transaction-isolation-levels.html#isolevel_repeatable-read