因此,我尝试使用 Laravel 4.2 对包含 600,000 条记录的超大数据库运行查询。这样做时,出现以下错误:
SQLSTATE[HY000]:一般错误:2014 其他无缓冲查询处于事件状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。 (SQL:从 'UserLog' 中选择 'username'、'timestamp'、'ip'、'appID',其中 'id' > 1179525)
这是我的代码:
public static function getUserLogData()
{
$getUsers = DB::connection('PORTAL2')->table('UserLog')
->select('username', 'timestamp', 'ip', 'appID')
->where('id', '>', '1179525')
->get();
$numOfRowsReturned = count($getUsers);
if($numOfRowsReturned>0)
{
return $getUsers;
}
return 0;
}
为了解释魔数(Magic Number) 1179525,我使用 ID 尝试仅选择 10 行,因为在 1179525 之后只有 10 个 ID。
当代码看起来像这样时,查询工作正常(尽管我想选择 ~500 行,而不是 1 行):
public static function getUserLogData()
{
$getUsers = DB::connection('PORTAL2')->table('UserLog')
->select('username', 'timestamp', 'ip', 'appID')
->where('id', '>', '1179525')
->first();
$numOfRowsReturned = count($getUsers);
if($numOfRowsReturned>0)
{
return $getUsers;
}
return 0;
}
关于如何解决这个问题有什么想法吗?
最佳答案
而不是 ->get()
使用 ->take(10)
或任何数字来指定返回行数的限制。 ->first()
实际上是 ->take(1)
。
另外,不要执行 count($getUsers) 然后检查它是否 > 0,而是使用
`if (!empty($getUsers))`
它会更有效地处理大型数据集,并按照你的意思去做。 count() 会遍历数组,empty() 只会检查它是否不为 null 或 0 长度。
关于php - Laravel 4.2 查询错误 - 当其他无缓冲查询处于事件状态时无法执行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020084/