我正在使用laravel项目,它使用一个mysql数据库。它有一些表,其中有超过500万的数据。这需要太多的时间来获得这些数据到前端。下面是我用来获取数据的函数。我使用了一些过滤器,如日期范围(从,到)按名称搜索($seach)分页数量(记录\编号)等,但当我尝试获取所有记录时,需要花费太多时间。对于这个问题有什么解决方案/优化吗?
谢谢。
public function transactionListBetween($from, $to, $sort, $search, $records_number, $filter, $previous_sort) {
$query = $this->accountTransactions
->with('transactionType', 'giver', 'recipient')
->leftJoin('tbdb_users as recipient', 'recipient.id', '=', 'tbdb_account_transaction.recipient_id')
->leftJoin('tbdb_users as giver', 'giver.id', '=', 'tbdb_account_transaction.giver_id')
->leftJoin('tbdb_account_transaction_type', 'tbdb_account_transaction.account_transaction_type_id', '=', 'tbdb_account_transaction_type.id')
->where('recipient.name', 'like', "%$search%")
->select('tbdb_account_transaction.*');
if($filter) {
if($filter == -1) {
$transactionTypeModel = \App::make('App\Models\AccountTransactionTypeModel');
$depositTypeIds = $transactionTypeModel->whereIn('name', ['PayPal Deposit', 'Eway Deposit', 'Bank Deposit', 'BPay Deposit', 'Poli Deposit'])->lists('id');
$query = $query->whereIn('tbdb_account_transaction.account_transaction_type_id', $depositTypeIds);
} else {
$query = $query->where('tbdb_account_transaction.account_transaction_type_id', $filter);
}
}
if($from) {
$query = $query->where('tbdb_account_transaction.created_date', '>=', $from);
}
if($to) {
$query = $query->where('tbdb_account_transaction.created_date', '<=', $to->endOfDay());
}
if($records_number == 'no_paginate') {
return $query->orderBy($sort, $previous_sort)
->get();
} else {
$totalAmount = $query->sum('amount');
$collection = $query->orderBy($sort, $previous_sort)->paginate($records_number);
$collection->totalAmount = number_format($totalAmount / 100, 2);
return $collection;
}
}
3条答案
按热度按时间roejwanj1#
找出原因。这是因为分页。分页要花很多时间。有超过50000页,所以这需要时间。我曾经
simplePaginate() instead of paginate()
. 然后它的加载速度比平常快au9on6nz2#
在我的例子中,我在使用mysql数据库时也遇到了这个问题。表中的这些大量记录与关系占用了太多时间。必须使用原始查询才能得到结果。您必须使用分页来显示数据。因为获取所有数据会减慢速度。
但我强烈建议您规范表结构。在我的例子中,我确实将我的表标准化了,用一年一次的时间分割。
dgtucam13#
您似乎正在执行3个左联接,并获得与使用
with
.你可以放下它们:
这将大大减少主结果集,使其更易于处理。