
MySQL 與 MariaDB 的關係與版本選擇
兩者的關係
MariaDB 是從 MySQL 分支出來的專案,由原開發團隊成員發起。早期版本高度相容,但隨著各自發展,差異逐漸擴大。
目前的狀況是:基本的 SQL 語法與多數應用程式的操作仍然相容,但在特定功能、系統資料表、複寫機制與部分語法上已有明顯差異。
對一般網站的實務意義
對典型的 PHP 網站應用(增刪改查、簡單的關聯查詢),兩者幾乎可以互換使用。
需要注意差異的情況:
- 使用了較新或特定的內建函式
- 依賴特定的系統資料表或狀態變數
- 使用複寫或叢集功能
- 使用 JSON 相關的進階功能——兩者的實作方式不同
- 特定的儲存引擎
版本的選擇
長期支援版本
兩個專案都有區分長期支援與一般版本。正式環境建議選用長期支援版本,理由是:
- 支援期間較長,不必頻繁升級
- 穩定性經過較長時間驗證
- 主機商與套件的支援較完整
具體的版本號與支援期限請查閱官方公告,不要憑印象判斷。
不要停在已停止支援的版本
與 PHP 一樣,停止支援後即使發現安全漏洞也不會再有修補。相關考量見PHP 版本升級要注意什麼。
儲存引擎
| InnoDB | MyISAM | |
|---|---|---|
| 交易支援 | 有 | 無 |
| 鎖定層級 | 列層級 | 資料表層級 |
| 外鍵 | 支援 | 不支援 |
| 當機復原 | 較可靠 | 可能需要修復 |
| 建議 | 預設選擇 | 舊系統遺留 |
現在幾乎沒有理由使用 MyISAM。 它的資料表層級鎖定在寫入頻繁時會造成明顯的等待,而且當機後容易需要修復。
檢查現有的資料表引擎
SELECT table_name, engine, table_rows FROM information_schema.tables WHERE table_schema = 'your_database';
轉換為 InnoDB
ALTER TABLE tablename ENGINE=InnoDB;
轉換前務必備份,並注意大型資料表的轉換會鎖住該表一段時間,應選在離峰時段進行。
常用的檢查指令
SELECT VERSION(); -- 版本 SHOW VARIABLES LIKE 'version%'; -- 詳細版本資訊 SHOW ENGINES; -- 可用的儲存引擎 SHOW VARIABLES LIKE 'character_set%';-- 字元集設定 STATUS; -- 連線與環境摘要
基本的設定調整
設定檔常見位置:
/etc/mysql/my.cnf /etc/mysql/mariadb.conf.d/50-server.cnf /etc/my.cnf
最關鍵的一項
innodb_buffer_pool_size = 1G
這是 InnoDB 用來快取資料與索引的記憶體區域,對效能的影響通常最大。
估算原則:
- 專用的資料庫伺服器——可設為實體記憶體的六到七成
- 與網站共用同一台——需保留給網頁伺服器與 PHP,通常設較保守
- 資料量小於設定值時,多設也沒用
其他常見的調整
max_connections = 150 innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 slow_query_log = 1 long_query_time = 1
不要照抄網路上的設定範本。 參數應依實際的記憶體、資料量與存取模式調整,抄來的設定可能讓情況更糟。
連線數的估算
max_connections 要與應用端的行程數對應。
以 PHP-FPM 為例:若 pm.max_children 設為 30,理論上最多會有 30 個併發連線(未使用持久連線時)。
設太低會出現連線被拒絕;設太高則可能在尖峰時耗盡記憶體。
行程池的設定見網頁伺服器的效能相關設定。
升級時的注意事項
- 完整備份——包含資料與設定檔
- 查閱該版本的升級說明——注意不相容的變更
- 在測試環境先執行一次
- 升級後執行系統資料表的升級程序
- 確認應用程式功能正常
- 觀察錯誤日誌數日
跨越多個主要版本時建議分階段,不要一次跳太多版。
本文以 MySQL 與 MariaDB 的常見版本為例,實際的指令、預設值與可用選項可能因版本與發行版而異。執行任何變更前請確實備份,並先在測試環境驗證。