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

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

用戶表單有200w用戶導致后臺用戶列表打不開,日志記錄sql查詢

管理 管理 編輯 刪除

這個情況其實是 MySQL 查詢設(shè)計和索引使用問題導致的典型性能瓶頸


我們先分析一下你的 SQL、瓶頸原因,再講優(yōu)化思路,最后給出幾種實用的解決方案。??


一、SQL 性能瓶頸分析

你的慢 SQL:

SELECT COUNT(*) AS think_count 
FROM (
  SELECT count(*) AS think_count 
  FROM `eb_user` `u`
  LEFT JOIN `eb_wechat_user` `w` ON `u`.`uid` = `w`.`uid`
  GROUP BY `u`.`uid`
) `_group_count_`

問題點:

  1. GROUP BY + COUNT 嵌套子查詢: 內(nèi)層 GROUP BY 會對 200w 用戶執(zhí)行一次分組,再計算每組數(shù)量,生成臨時表,代價極高。
  2. LEFT JOIN: eb_wechat_user 若也有大量記錄,JOIN 會放大數(shù)據(jù)量,尤其當索引不合理時。
  3. 外層 COUNT(): 實際只需要統(tǒng)計行數(shù),卻先讓內(nèi)層生成完整的 200w 分組結(jié)果。
  4. 沒有用索引覆蓋: 如果 u.uid 或 w.uid 沒有合適索引,MySQL 只能全表掃描 + 文件排序。

結(jié)果:執(zhí)行時間 32.7 秒,非常合理(對于200萬行 JOIN + GROUP BY)。

二、MySQL 執(zhí)行邏輯簡化圖

eb_user (200w) ---LEFT JOIN--> eb_wechat_user (~200w)
      |                  |
      |                  |
      +---> 按 uid 分組 -> 臨時表 -> 外層 COUNT(*)

每個階段都在全表掃描,磁盤IO、排序、分組都耗時。

三、優(yōu)化方向

1. 去掉不必要的子查詢

如果只是想統(tǒng)計用戶數(shù)量,其實根本不需要子查詢:

SELECT COUNT(DISTINCT u.uid)
FROM eb_user u
LEFT JOIN eb_wechat_user w ON u.uid = w.uid;

這條語句能直接用索引優(yōu)化。

2. 確保關(guān)鍵字段有索引

確保下面的索引存在:

ALTER TABLE eb_user ADD INDEX idx_uid(uid);
ALTER TABLE eb_wechat_user ADD INDEX idx_uid(uid);

如果 uid 已經(jīng)是主鍵,就不用加。

3. 不用 LEFT JOIN 時改為 INNER JOIN

如果邏輯上允許(比如每個用戶在 wechat 表中必定有記錄):

SELECT COUNT(DISTINCT u.uid)
FROM eb_user u
JOIN eb_wechat_user w ON u.uid = w.uid;

INNER JOINLEFT JOIN 快得多(MySQL 優(yōu)化器可提前剪枝)。

4. 避免實時 COUNT 大表

后臺列表一般只需展示分頁數(shù)據(jù)和總數(shù),可以:

  • 分頁查詢 + 預估總數(shù) SELECT * FROM eb_user LIMIT 0, 20; 總數(shù)通過緩存或定時任務更新。
  • 或使用 EXPLAIN + 查詢緩存表 每隔5分鐘更新一次 user_count 緩存表,前端不實時查 COUNT。

5. 調(diào)整 SQL 寫法讓優(yōu)化器可用索引

MySQL 優(yōu)化器對 COUNT(DISTINCT) + 索引優(yōu)化很敏感。

-- 優(yōu)化版 1:直接使用 DISTINCT
SELECT COUNT(DISTINCT u.uid)
FROM eb_user u
LEFT JOIN eb_wechat_user w ON u.uid = w.uid;
-- 優(yōu)化版 2:只查主表統(tǒng)計
SELECT COUNT(*) FROM eb_user;

如果業(yè)務上只統(tǒng)計用戶總數(shù),這條最快

6. 分頁數(shù)據(jù)展示時優(yōu)化 JOIN

后臺用戶列表只需顯示部分字段,可以:

SELECT u.uid, u.nickname, w.openid
FROM eb_user u
LEFT JOIN eb_wechat_user w ON u.uid = w.uid
ORDER BY u.uid DESC
LIMIT 0, 20;

再加上:

ALTER TABLE eb_user ADD INDEX idx_uid_desc(uid DESC);

四、針對 ThinkPHP 場景(你的 SQL 日志看起來是 ThinkPHP 生成的)

如果你用的是 ThinkPHP ORM:

問題代碼示例

Db::name('user')
  ->alias('u')
  ->leftJoin('wechat_user w', 'u.uid=w.uid')
  ->count();

ThinkPHP 會生成你貼的那種“二層 COUNT”語句。

解決方法

直接使用:

Db::query("SELECT COUNT(DISTINCT u.uid) as total FROM eb_user u LEFT JOIN eb_wechat_user w ON u.uid=w.uid");

Db::name('user')->count(); // 僅統(tǒng)計主表數(shù)量

五、如果確實需要統(tǒng)計JOIN分組數(shù)量

那就使用 臨時表 + 預聚合方案

CREATE TABLE user_wechat_summary AS
SELECT u.uid, COUNT(w.uid) AS wechat_count
FROM eb_user u
LEFT JOIN eb_wechat_user w ON u.uid = w.uid
GROUP BY u.uid;

然后后臺查詢直接:

SELECT COUNT(*) FROM user_wechat_summary;

通過定時任務每晚刷新一次這個表,性能可以提升百倍以上。


六、總結(jié)優(yōu)化建議清單

問題優(yōu)化方案
查詢結(jié)構(gòu)嵌套 COUNT改為 COUNT(DISTINCT)
JOIN 未建索引uid 加索引
LEFT JOIN 無必要改成 INNER JOIN
COUNT 大表慢改成緩存統(tǒng)計
GROUP BY 全表掃描預聚合中間表
ORM 自動生成的復雜 SQL改寫為原生 SQL


針對 200w 用戶列表的分頁+緩存方案(含 SQL + ThinkPHP 實現(xiàn)示例)

請登錄后查看

小碼二開 最后編輯于2025-10-24 10:03:13

快捷回復
回復
回復
回復({{post_count}}) {{!is_user ? '我的回復' :'全部回復'}}
排序 默認正序 回復倒序 點贊倒序

{{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 || '暫無簡介'}}
附件

{{itemf.name}}

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

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

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

相關(guān)推薦

快速安全登錄

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

微信登錄/注冊

切換手機號登錄

{{ bind_phone ? '綁定手機' : '手機登錄'}}

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

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

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