1 頁 (共 1 頁)

mariadb-server 的優化設定

發表於 : 2026-08-26, 23:35
Brave Ye
了解!你使用的是 Debian 13.6 內建的 MariaDB Server。
當我提到 MyISAM 或 InnoDB 時,它們是指 MariaDB 資料庫「內部」用來儲存資料表的引擎(Storage Engine)。
phpMyChat Plus 1.99 的安裝程式碼因為年代久遠(約 10~20 年前),它在建立資料庫時,預設會強制指定使用舊式的 ENGINE=MyISAM [1]。這就是導致多核心(12核)伺服器依然會卡頓的最大隱形殺手。
## 為什麼 MyISAM 在聊天室會慢?

* MyISAM(舊引擎):採用資料表鎖定(Table Lock)。當有一個人發言或重新整理,MariaDB 寫入資料時,整張資料表會被鎖死,此時其他 11 個 CPU 核心完全幫不上忙,所有人的聊天畫面只能卡住排隊。
* InnoDB(新引擎):採用資料列鎖定(Row Lock)。大家可以同時讀寫不同的聊天訊息,12 個 CPU 核心可以同時併發處理。

既然你的伺服器硬體(12核、15.5G RAM)非常強大,只要把聊天室的資料表轉成 InnoDB,就能完美解放硬體效能。
------------------------------
## 具體優化作法## 步驟 1:將 phpMyChat 資料表轉換為 InnoDB
請登入你的 MariaDB(或透過 phpMyAdmin),執行以下指令將聊天室最核心的幾張資料表轉為新引擎。

1. 登入資料庫(請替換為你的帳號):

sudo mysql -u root

2. 切換到你的聊天室資料庫(假設叫 phpmychat):

USE phpmychat;

3. 執行轉換指令(請根據你實際的資料表名稱調整,通常是這些):

ALTER TABLE c_messages ENGINE=InnoDB;ALTER TABLE c_users ENGINE=InnoDB;ALTER TABLE c_reg_users ENGINE=InnoDB;
phpmyadmin 的選 plus 資料庫,再選上方SQL頁簽輸入

代碼: 選擇全部

ALTER TABLE c_ban_users ENGINE=InnoDB;ALTER TABLE c_config ENGINE=InnoDB;ALTER TABLE  	c_lurkers ENGINE=InnoDB;ALTER TABLE c_messages ENGINE=InnoDB;ALTER TABLE c_reg_users ENGINE=InnoDB;ALTER TABLE c_stats ENGINE=InnoDB;ALTER TABLE c_users ENGINE=InnoDB;
再按右下執行鍵
註:轉換過程中,MariaDB 會自動將結構升級,這能瞬間消除資料表鎖定引起的排隊卡頓。

## 步驟 2:利用 15.5G 記憶體優化 MariaDB 設定
Debian 13.6 預設的 MariaDB 設定非常保守(只適合 1G RAM 的主機),這會讓你的 12 核伺服器平白朗費資源。
請編輯 MariaDB 設定檔:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

在 [mysqld] 區塊下方,加入或修改以下針對 InnoDB 的記憶體優化參數(這會分出約 2GB 記憶體專門給資料庫緩存,非常安全):

[mysqld]
# 提高最大連線數,對應 Apache 與 PHP-FPM 的高並發
max_connections = 300

# 針對 InnoDB 的核心優化(最重要)
innodb_buffer_pool_size = 2G ; 讓聊天室資料全部常駐在記憶體中讀取
innodb_log_file_size = 512M ; 提高日誌大小,加速寫入
innodb_flush_log_at_trx_commit = 2 ; 降低硬碟寫入頻率,大幅提升聊天室發言速度

## 步驟 3:重啟 MariaDB 服務
儲存離開後,重啟資料庫使設定生效:

sudo systemctl restart mariadb

------------------------------
完成「Apache 常駐連線池」+「PHP-FPM 進程開大」+「MariaDB 轉 InnoDB」這三部曲後,這台 12 核主機的實力才會真正發揮,聊天室的卡頓感通常會完全消失。
如果在轉換過程中遇到任何錯誤,或是想確認資料表名稱,可以告訴我:

* 你的 phpMyChat 在 MariaDB 裡的資料表前綴(例如是不是 c_ 開頭)?
* 執行 ALTER TABLE 時有沒有出現任何錯誤訊息?