因此,使用Laravel 4.2,我尝试在600,000条记录的超大型数据库上运行查询。这样做时,我收到以下错误:
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: select 'username', 'timestamp', 'ip', 'appID' from 'UserLog' where '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;
}
要解释幻数 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;
}
有关如何解决此问题的任何想法?
答案 0 :(得分:1)
而不是->get()
使用->take(10)
或任何数字来指定返回的行数限制。 ->first()
确实是->take(1)
。
而不是做计数($ getUsers),然后检查它是否是> 0,使用
`if (!empty($getUsers))`
使用大型数据集会更有效,并且您的意思是做什么。 count()将遍历数组,empty()将仅检查它是否为null或0长度。