核心瓶頸
磁碟搜尋(Seek)是大型資料庫效能首要瓶頸。隨機存取大數據時,每次讀取至少 1 次搜尋,寫入至少 2 次。優化核心在於減少搜尋次數與平行化 I/O。
策略 1:符號連結分散存放
資料庫級
# Unix
mkdir /dr1/databases/test
ln -s /dr1/databases/test /var/lib/mysql/test
# Windows (my.ini)
[mysqld]
symbolic-links=1
# 建立 C:\mysql\data\test.sym 內容為 D:\data\test\
將不同資料庫放置不同物理磁碟,平衡 I/O 負載。
資料表級
- MySQL 4.0+ MyISAM 完整支援
DATA DIRECTORY、INDEX DIRECTORY
CREATE TABLE t (c INT) DATA DIRECTORY='/disk1/data' INDEX DIRECTORY='/disk2/index';
- 避免在
ALTER TABLE、REPAIR TABLE 時遺失連結(舊版風險)
策略 2:條帶化
- 將資料按區塊輪流寫入多磁碟(RAID 0 或軟體條帶)
- 區塊大小(stripe size)需壓測調優,典型 64KB-256KB
- 適用:順序掃描、大量匯入/匯出、全表備份
策略 3:RAID 等級選擇
| RAID | 適用場景 | 備註 |
| RAID 0 | 可重建資料(如暫存、快取、日誌) | 最高效能,無冗餘 |
| RAID 1/10 | 核心業務資料、系統盤 | 寫入懲罰較小,強烈推薦 |
| RAID 5/6 | 歸檔、唯讀、成本敏感 | 寫入效能差,重建風險高 |
關鍵業務建議 RAID 10,兼顧效能與可用性;若記憶體充足,RAID 10 + 大量快取效果最佳。
策略 4:Linux 磁碟參數調校
# hdparm 開啟 DMA、多扇區傳輸
hdparm -m 16 -d 1 /dev/sda
# 掛載選項減少 atime 更新
mount -o noatime,async /dev/sda1 /var/lib/mysql
noatime:不更新存取時間,減少元資料寫入
async:非同步寫入,提升吞吐(需評估斷電風險)
- 警告:hdparm 設定錯誤可能導致檔案系統損壞,調整前必須備份並壓測
策略 5:MySQL 內部優化配合
innodb_flush_method=O_DIRECT 避免雙重快取
innodb_io_capacity 設定為磁碟實際 IOPS(SSD 可設 5000-20000)
innodb_read_io_threads/write_io_threads 依 CPU 核心調整
- 大表分區(Partitioning)配合不同磁碟存放分區
- 上一篇文章: PHP mysql_data_seek() 函數詳解:結果集指標隨機存取控制
- 下一篇文章: MySQL 5.1 新特性:通用查詢日誌與慢查詢日誌動態管理
Copyright ©
程式碼之家 All Rights Reserved