国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

webadmin 分頁查詢優(yōu)化

Achun

關(guān)于后臺查詢,自動分頁的簡單優(yōu)化

可以看到我這里后臺的數(shù)據(jù)已經(jīng)達到了1億,使用后臺自動分頁已經(jīng)非常的慢(一點也不夸張的說)

截圖


截圖


找到后臺控制器的繼承類 Crud
截圖


看了下代碼不出意外就是這個查詢每次都統(tǒng)計總數(shù)造成的

有沒有什么辦法能緩存每次的統(tǒng)計總數(shù)呢?

很簡單,那就使用tosql()來判斷,根據(jù)查詢條件來緩存匹配當前總條數(shù)

查了一下文檔,因為使用的是laravel的paginator,那就意味著可以用simplePaginate

如果使用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只適合一些情況)
截圖

直接看查詢結(jié)果,起飛~

截圖

目前手動添加查詢條件(一些復(fù)雜查詢),redis key 匹配會有問題,自行打印排除解決
截圖
可以看到這里語句打印出來是預(yù)編譯,為防止key匹配失敗--需要將查詢的值拼接在key上.

最后還要提一句,如果涉及到offset值過大一樣會變慢,這種時候就要考慮使用子查詢索引優(yōu)化

862 4 5
4個評論

efnic

感謝分享。

  • 暫無評論
ersic

很有用的分享

  • 暫無評論
德瑪西亞

感謝分享。

  • 暫無評論
dj880

感謝分享~

  • 暫無評論

Achun

340
積分
0
獲贊數(shù)
0
粉絲數(shù)
2023-12-04 加入
??