首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 連接數暴增急救:三招提升負載能力、防止雪崩

     編輯:MySQL 資料庫相關知識

    現象與風險

    連接數飆升至 600+ 甚至上千,MySQL CPU 飆高、回應變慢、甚至 OOM 掛掉。核心矛盾:單執行緒處理模型下,連接數與效能呈負相關。

    招式一:限制 InnoDB 並發執行緒 (立竿見影)

    -- 線上動態調整,無需重啟
    SET GLOBAL innodb_thread_concurrency = 16;  -- 先降至 16 觀察,再逐步調大至 64
    -- 永久生效寫入 my.cnf
    [mysqld]
    innodb_thread_concurrency = 64

    原理: 限制同時進入 InnoDB 核心層的執行緒數,減少上下文切換與鎖競爭,類比「食堂打飯限流」。

    招式二:調整最大連接數與單用戶上限 (治標)

    修改配置檔 (永久)

    [mysqld]
    max_connections = 1000          # 預設 151,視記憶體調整
    max_user_connections = 500      # 單用戶上限,防單一應用佔滿

    線上動態生效

    SET GLOBAL max_connections = 1000;
    SET GLOBAL max_user_connections = 500;

    監控指令

    SHOW VARIABLES LIKE 'max_connections';
    SHOW PROCESSLIST;          -- 當前連線
    SHOW STATUS LIKE 'Threads_connected';

    招式三:關閉 information_schema 統計資訊即時更新 (隱形殺手)

    監控工具頻繁查詢 information_schema.TABLES 觸發 innodb_stats_on_metadata,導致大量磁碟讀取。

    SET GLOBAL innodb_stats_on_metadata = OFF;
    -- 永久
    [mysqld]
    innodb_stats_on_metadata = 0

    Linux 手動編譯安裝環境特殊修改

    編輯 /usr/local/mysql/bin/mysqld_safe,在 mysqld 啟動行追加:

    -O max_connections=1500

    重啟驗證:mysqladmin -uroot -p variables | grep max_connections

    長期架構建議

    1. 應用層引入連線池 (HikariCP、Druid),嚴禁短連線風暴
    2. 讀寫分離:主庫寫、從庫讀,分散連接壓力
    3. 引入 ProxySQL / MyCat 做連線多工、查詢路由、熔斷限流
    4. 升級 MySQL 8.0 / Percona / MariaDB 享受 Thread Pool 原生支援
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved