本文整理自 Monty 在 O'Reilly Open Source Convention 2000 大會的演講第四部分,涵蓋 MySQL 資料儲存方式、表類型、行格式、快取系統與緩衝區變數五大核心主題。
十六、MySQL 如何儲存資料
- 資料庫以目錄形式儲存
- 資料表以檔案形式儲存
- 欄位以變長或定長格式儲存於檔案中(BDB 表採頁面儲存)
- 支援記憶體表(HEAP)
- 資料庫與表可透過符號連結分散於不同磁碟
- Windows 下支援
.sym 檔案實現內部符號連結
十七、MySQL 表類型詳解
| 類型 | 特性 |
| HEAP | 固定行長、純記憶體儲存、採 Hash 索引,速度極快但重啟後資料消失 |
| ISAM | MySQL 3.22 早期 B-tree 格式,已淘汰 |
| MyISAM | ISAM 進化版:二進制可移植、支援 NULL 索引、變長行碎片更少、大檔案支援、更優索引壓縮、更佳鍵值統計、更快 auto_increment |
| BDB (Berkeley DB) | 事務安全表,支援 BEGIN WORK / COMMIT / ROLLBACK |
十八、MySQL 行格式(針對 ISAM/MyISAM)
- 若所有欄位皆為定長(無 VARCHAR/BLOB/TEXT),建立定長表 → 速度快、安全性高
- 含變長欄位則建立動態行格式 → 儲存空間較少,但頻繁更新易產生碎片
- 權衡策略:將 VARCHAR/BLOB/TEXT 移至獨立表,換取主表高速查詢
- 利用
myisampack 建立唯讀壓縮表 → 極小化磁碟佔用,適合不再更新的日誌表
十九、MySQL 快取系統(所有執行緒共享、一次性配置)
| 快取類型 | 控制參數 | 預設值 | 說明 |
| 鍵值快取 | key_buffer_size | 8MB | 索引區塊快取 |
| 表快取 | table_cache | 64 | 開啟表描述符快取 |
| 執行緒快取 | thread_cache_size | 0 | 重用執行緒減少建立開銷 |
| 主機名快取 | 編譯時指定 | 128 | DNS 解析結果快取 |
| 記憶體映射表 | — | — | 僅用於壓縮表 |
關鍵設計:MySQL 無行級快取,將資料頁快取交由作業系統管理。
二十、MySQL 緩衝區變數(非共享、按需配置)
| 變數 | 用途 |
sort_buffer_size | ORDER BY / GROUP BY 排序 |
read_buffer_size / record_buffer | 全表掃描 |
join_buffer_size | 無索引聯結 |
myisam_sort_buffer_size | REPAIR TABLE / 索引建立 |
net_buffer_length | 讀取 SQL 語句與快取結果 |
tmp_table_size | 臨時結果 HEAP 表大小上限 |