宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動(dòng)態(tài)
精選推薦

(200w 用戶列表頁面卡頓)是大多數(shù)中大型系統(tǒng)后臺(tái)的通病

管理 管理 編輯 刪除

我們可以通過 分頁 + 緩存 + 異步統(tǒng)計(jì) 來完美解決。

非常好 ?? 你這個(gè)需求(200w 用戶列表頁面卡頓)是大多數(shù)中大型系統(tǒng)后臺(tái)的通病,我們可以通過 分頁 + 緩存 + 異步統(tǒng)計(jì) 來完美解決。

下面我給出完整方案,分為 架構(gòu)思路 → SQL 優(yōu)化 → 緩存方案 → ThinkPHP 示例代碼 四個(gè)部分,拿去直接可落地用。??


一、架構(gòu)思路(核心目標(biāo))

模塊優(yōu)化目標(biāo)說明
分頁查詢秒級(jí)打開只查詢 20 條數(shù)據(jù),不做復(fù)雜統(tǒng)計(jì)
總數(shù)統(tǒng)計(jì)緩存或異步更新避免每次執(zhí)行 COUNT(200w)
搜索 / 篩選可索引字段查詢避免模糊 LIKE + JOIN
JOIN 數(shù)據(jù)最小化盡量只在必要字段時(shí)再 JOIN


二、數(shù)據(jù)庫設(shè)計(jì)與索引優(yōu)化

1?? 關(guān)鍵索引

ALTER TABLE eb_user ADD PRIMARY KEY (uid);
ALTER TABLE eb_user ADD INDEX idx_created_at(created_at);
ALTER TABLE eb_wechat_user ADD INDEX idx_uid(uid);
uid 是主鍵; created_at 用于分頁排序; JOIN 用的字段必須有索引。


三、分頁 + 異步統(tǒng)計(jì)方案

方案目標(biāo)

  1. 列表頁加載快(1 秒內(nèi))
  2. 總數(shù)、搜索、統(tǒng)計(jì)延遲可接受(幾分鐘內(nèi)更新)


1. 用戶列表分頁 SQL(高效版)

SELECT 
  u.uid,
  u.nickname,
  u.phone,
  w.openid,
  w.subscribe
FROM eb_user u
LEFT JOIN eb_wechat_user w ON u.uid = w.uid
ORDER BY u.created_at DESC
LIMIT 0, 20;
  • 避免在分頁時(shí)使用 COUNT(*)。
  • 用索引字段排序(created_at 或 uid)。


2. 用戶總數(shù)統(tǒng)計(jì)緩存表

新建一個(gè)緩存表:

CREATE TABLE sys_stat_cache (
  id INT PRIMARY KEY AUTO_INCREMENT,
  stat_key VARCHAR(64) UNIQUE,
  stat_value BIGINT,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

初始化:

INSERT INTO sys_stat_cache (stat_key, stat_value) VALUES ('user_total', 0);


3. 定時(shí)任務(wù)更新用戶總數(shù)

用一個(gè)后端定時(shí)腳本(如 ThinkPHP 命令行任務(wù)):

<?php
namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Db;

class UpdateUserCount extends Command
{
    protected function configure()
    {
        $this->setName('update:usercount')
             ->setDescription('更新用戶總數(shù)緩存');
    }

    protected function execute(Input $input, Output $output)
    {
        $count = Db::name('eb_user')->count();
        Db::name('sys_stat_cache')
            ->where('stat_key', 'user_total')
            ->update(['stat_value' => $count]);
        $output->writeln("User total updated: {$count}");
    }
}

建議執(zhí)行周期:

  • 每 5 分鐘一次(用 crontab 或隊(duì)列觸發(fā))
  • 對(duì) 200w 用戶表,這種 COUNT 操作耗時(shí) 2~5 秒,完全可以后臺(tái)運(yùn)行。


4. 后臺(tái)控制器讀取緩存統(tǒng)計(jì)

// app/admin/controller/UserController.php

use think\facade\Db;

public function index()
{
    // 分頁參數(shù)
    $page = input('page', 1);
    $limit = input('limit', 20);
    $offset = ($page - 1) * $limit;

    // 快速分頁查詢
    $list = Db::name('eb_user')
        ->alias('u')
        ->leftJoin('eb_wechat_user w', 'u.uid=w.uid')
        ->field('u.uid,u.nickname,u.phone,w.openid,w.subscribe')
        ->order('u.created_at desc')
        ->limit($offset, $limit)
        ->select();

    // 從緩存表讀取總數(shù)
    $total = Db::name('sys_stat_cache')
        ->where('stat_key', 'user_total')
        ->value('stat_value');

    return json([
        'code' => 0,
        'data' => [
            'list'  => $list,
            'total' => $total
        ]
    ]);
}

效果:

  • 查詢 20 條記錄:< 0.5 秒
  • 總數(shù)從緩存表讀?。?lt; 1 毫秒 ? 后臺(tái)頁面可秒開


5. 可選 Redis 緩存(更快)

如果系統(tǒng)已經(jīng)使用 Redis,可以直接:

// 寫緩存
$count = Db::name('eb_user')->count();
cache('user_total', $count, 300); // 緩存 5 分鐘

// 讀緩存
$total = cache('user_total');
Redis 讀取速度約 0.2ms,比數(shù)據(jù)庫緩存表還快。


四、整體流程圖

┌────────────┐
│ 前端請(qǐng)求用戶列表 │
└──────┬─────┘
       │
       ▼
┌─────────────────────────────┐
│ 控制器從 sys_stat_cache 取總數(shù) │  ← (0.001s)
│ 并分頁查詢用戶表 + 關(guān)聯(lián)表       │  ← (0.5s)
└─────────────────────────────┘
       │
       ▼
┌──────────────────────────┐
│ 定時(shí)任務(wù)每5分鐘更新緩存 │ ← (后臺(tái)執(zhí)行)
└──────────────────────────┘


五、最終效果與性能提升對(duì)比

操作原始方案優(yōu)化后
后臺(tái)列表打開30+ 秒< 1 秒
總數(shù)統(tǒng)計(jì)實(shí)時(shí) COUNT(200w)緩存讀取
系統(tǒng)負(fù)載穩(wěn)定
可擴(kuò)展性優(yōu)秀,可擴(kuò)展到千萬級(jí)


可擴(kuò)展方向(后續(xù)升級(jí))

  1. 用戶表分表:按注冊(cè)時(shí)間或地區(qū)水平分表。
  2. 搜索索引引擎:用 Elasticsearch / Sphinx 替代復(fù)雜 LIKE 查詢。
  3. 數(shù)據(jù)異步聚合:用消息隊(duì)列異步寫入統(tǒng)計(jì)緩存。
  4. MySQL 8.0 并行查詢優(yōu)化:利用窗口函數(shù)或 JSON 聚合簡(jiǎn)化多表 JOIN。



請(qǐng)登錄后查看

小碼二開 最后編輯于2025-10-24 10:07:36

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}} 【已收集】
沙發(fā) 板凳 地板 {{item.floor}}# 【已收集】
{{item.user_info.title || '暫無簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
53
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁頭條 首頁動(dòng)態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服