資料庫效能優化是系統工程,涵蓋五大層面:
表 > 2GB 時,MySQL 大量使用 64 位整數運算,Alpha/Sparc/IA-64/x86-64 顯著優於 32 位。
優化順序:RAM → 快速磁碟 → CPU。更多記憶體 = 更多熱點索引頁緩存 = 更少磁碟 I/O。
async,noatime;hdparm -m16 -d1 開啟多扇區/DMA,效能提升 5~50%。專用資料庫服務器建議 1 Gbps 乙太網,低延遲同等重要。
innodb_buffer_pool_size 等緩存參數。ulimit -n(開啟檔案數)、max user processes(執行緒數)。| API | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| C (libmysqlclient) | 原生、最快、控制力最強 | 開發成本高 | 高效能核心模組 |
| C++ (MySQL Connector/C++) | 物件導向、開發效率高 | 仍在積極開發中 | C++ 專案 |
| PHP (mysqli/PDO) | 易學、資源輕量、PHP 7+ 極快 | 長連接管理需注意 | Web 應用首選 |
| Perl (DBI/DBD::mysql) | 跨平台、成熟穩定 | 效能略遜 PHP | 腳本/遷移專案 |
| ODBC / JDBC | 跨資料庫可移植 | 效能損耗 19%+、Bug 多、未來不確定 | 異構整合、Java 體系 |
建議:核心高頻路徑用 C/PHP 原生驅動;異構報表用 ODBC/JDBC。
SELECT *,僅查所需欄位。LOCK TABLES + 多行 INSERT,減少交互往返。crash-me 測試相容性。| 參數 | 調優場景 |
|---|---|
| key_buffer_size | MyISAM 索引緩存,設為實體記憶體 25~50% |
| innodb_buffer_pool_size | InnoDB 數據+索引緩存,設為實體記憶體 60~80% |
| table_open_cache | 大量表/高併發時調大 |
| thread_cache_size | 頻繁新連線時調大(避免執行緒創建開銷) |
| sort_buffer_size / read_rnd_buffer_size | 大量 ORDER BY / GROUP BY / 複雜 JOIN |
| join_buffer_size | 無索引 JOIN(應優先加索引) |
| max_heap_table_size / tmp_table_size | 臨時表轉磁碟閾值 |
| log_slow_queries / long_query_time | 開啟慢查詢日誌定位問題 SQL |
INDEX(name(10))。PROCEDURE ANALYSE() 建議最優類型。NOT NULL + DEFAULT 取代 NULL,利於索引與統計。GROUP BY。LIMIT m,n 分頁;DELETE ... LIMIT 批次刪除。INSERT ... ON DUPLICATE KEY UPDATE / REPLACE 合併寫入邏輯。LOAD DATA INFILE 批量導入比 INSERT 快 20 倍。JOIN(MySQL 優化器對 JOIN 更成熟)。EXPLAIN 分析 type=ALL/index、Extra=Using temporary/filesort 等危險信號。OPTIMIZE TABLE(動態行表)、ANALYZE TABLE 更新統計。myisamchk -a 重建索引統計(先停庫)。mysqladmin -i10 processlist extended-status 監控;或用 MySQL Workbench/GUI。--with-mysqld-ldflags=-all-static 靜態編譯 + strip 精簡二進制。HAVING 用於非聚合欄位(應移至 WHERE)。ORDER BY。WHERE 執行 UPDATE/DELETE(用 --i-am-a-dummy 防呆)。優化無終點,唯有「找瓶頸 → 針對性調優 → 驗證 → 迭代」。以 EXPLAIN、SHOW STATUS、慢查詢日誌為三大儀器,配合業務增長節奏,持續演進架構與參數,方能長治久安。