本文從表結構設計、SQL 語句優化、儲存引擎選型、索引策略、MySQL 與主流商業資料庫對比五大維度,系統闡述 MySQL 高效能運行的核心原則與實戰技巧。
GBK 或 GB2312,節省 50% 以上儲存空間,減少 I/O。utf8mb4,並針對熱點表評估空間成本。TEXT/BLOB/長 VARCHAR 且非高頻讀取的欄位,拆至獨立表(垂直拆分)。核心原則:滿足業務前提下,選佔用空間最小的類型。
| 場景 | 建議類型 | 避坑指南 |
|---|---|---|
| 整數 ID/計數 | TINYINT/SMALLINT/INT/BIGINT 分級 | 確非負加 UNSIGNED;慎用 BIGINT |
| 固定精度小數(金額) | 乘 100/1000 存 INT/BIGINT | 避免 DECIMAL/DOUBLE 精度陷阱 |
| 定長字串(MD5/UUID) | CHAR(32)/BINARY(16) | CHAR 比 VARCHAR 省 1-2 位元組長度前綴 |
| 變長字串 | VARCHAR(N) N 為實際最大長度 | 拒絕 VARCHAR(255) 濫用;UTF-8 字符非位元組 |
| 日期時間 | TIMESTAMP(4B) > DATETIME(8B) > DATE(3B) | 精確到日用 DATE;TIMESTAMP 依賴時區 |
| 狀態/枚舉值 | ENUM / SET | ENUM 尾部新增值無需重建表 |
| 大對象(圖片/文件) | 檔案系統/物件儲存 | 資料庫僅存路徑/哈希,嚴禁存 BLOB |
ORDER BY/GROUP BY/DISTINCT 耗 CPU;用索引順序、減少參與排序行數、非必要不排序。OR 常導致全掃;改用 UNION ALL 分開走索引再合併。UNION 需去重排序,ALL 直接合併,省 CPU。EXPLAIN 全量 SQL,防顧此失彼。| 誤區 | 真相 |
|---|---|
| COUNT(1)/COUNT(pk) 比 COUNT(*) 快 | MySQL 對 COUNT(*) 有特殊優化;COUNT(col) 統計非 NULL 行,語義不同、可能更慢 |
| SELECT 少欄位就少讀資料 | 行式儲存按頁讀取,整行入記憶體;除非覆蓋索引避免回表,否則 I/O 同 |
| ORDER BY 必排序 | 若查詢走索引且索引順序滿足排序,MySQL 直接返回有序結果,省略 Filesort |
| 引擎 | 核心特性 | 適用場景 | 關鍵調優 |
|---|---|---|---|
| MyISAM | 表鎖、無事務、只緩存索引、COUNT(*) 極快 | 唯讀/少寫、低併發、不需事務、靜態資料 | key_buffer 盡量大;延遲插入批量寫入;順序 INSERT 減阻塞 |
| InnoDB | 行鎖、MVCC、4 隔離級、緩存索引+數據、聚簇索引 | 高併發、頻繁寫入、需事務/外鍵、數據一致性要求高 | 主鍵越小越好;innodb_buffer_pool_size 盡量大(記憶體 70%);避免全掃觸發表鎖 |
| NDB Cluster | 分散式、記憶體儲存、多主寫入、跨節點網路通訊 | 極高併發、簡單查詢、固定過濾、單請求小數據量、不想自建分片 | 萬兆網路互聯;SQL 節點多於 Data 節點;查詢極簡避免跨節點傳輸 |
AUTO_INCREMENT;Oracle 需 SEQUENCE。LIMIT 簡潔;Oracle 需 ROWNUM 子查詢。NOW()、DATE/TIME;Oracle SYSDATE、單一 DATE 型別。NOT NULL 允許空串;Oracle 視同 NULL。簡單、高效、可靠 — 在滿足 99% 客戶需求前提下,將資源傾注於效能極致;功能完善服務於商業需求,非自我堆疊。
TPCC 基準測試長期與 Oracle 齊頭並進,開源生態下阿里巴巴「去 IOE」推動深度定製成為大廠標配。