可以看到我這里后臺的數(shù)據(jù)已經(jīng)達到了1億,使用后臺自動分頁已經(jīng)非常的慢(一點也不夸張的說)
找到后臺控制器的繼承類 Crud
看了下代碼不出意外就是這個查詢每次都統(tǒng)計總數(shù)造成的
很簡單,那就使用tosql()來判斷,根據(jù)查詢條件來緩存匹配當前總條數(shù)
如果使用simplePaginate, 不會計算總行數(shù),查詢會比paginate快很多。不過你也因此不能知道總頁數(shù),沒辦法跳到任意頁。
$paginator->total() 獲取結(jié)果集中的數(shù)據(jù)總數(shù)(在 simplePaginate 中不可用)
這個可以每次統(tǒng)計后保存下來
protected function doFormat($query, $format, $limit): Response
{
$methods = [
'select' => 'formatSelect',
'tree' => 'formatTree',
'table_tree' => 'formatTableTree',
'normal' => 'formatNormal',
];
$key = $query->toSql();
// 先記錄sql條件作為鍵值
if(Redis::get($key)){
$total = Redis::get($query->toSql());
}else{
$total = $query->count('*');
Redis::set($key,$total,'EX',3600); //緩存時間根據(jù)業(yè)務(wù)調(diào)整
}
$paginator = $query->simplePaginate($limit);
// $paginator = $query->paginate($limit);
// $total = $paginator->total();
$items = $paginator->items();
if (method_exists($this, "afterQuery")) {
$items = call_user_func([$this, "afterQuery"], $items);
}
$format_function = $methods[$format] ?? 'formatNormal';
return call_user_func([$this, $format_function], $items, $total);
}
因為涉及到數(shù)據(jù)新增的情況,需要在當前表新增數(shù)據(jù)的時候
清空所有select能模糊匹配的key(+1只適合一些情況)
目前手動添加查詢條件(一些復(fù)雜查詢),redis key 匹配會有問題,自行打印排除解決
可以看到這里語句打印出來是預(yù)編譯,為防止key匹配失敗--需要將查詢的值拼接在key上.
最后還要提一句,如果涉及到offset值過大一樣會變慢,這種時候就要考慮使用子查詢索引優(yōu)化
感謝分享。