引擎選擇:MyISAM vs InnoDB
| 維度 | MyISAM | InnoDB |
| 讀效能 | 優(索引壓縮、純讀快) | 良(Buffer Pool、MVCC) |
| 寫效能 | 表鎖,並發差 | 行鎖,高並發 |
| 事務 | 不支援 | 支援 ACID |
| 外鍵 | 不支援 | 支援 |
| 崩潰恢復 | 無 | Redo/Undo Log 完整恢復 |
| 空間 | 索引/資料分離,體積小 | 聚簇索引,體積大 |
| 備份恢復 | 複製 .frm/.MYD/.MYI 极快 | 需 xtrabackup/mysqldump |
建議:核心業務用 InnoDB;日誌/報表/唯讀歷史表可考慮 MyISAM。
鎖機制真相
SELECT COUNT(*)、ORDER BY 佔 60%+ SQL
- InnoDB 行鎖只在 WHERE 命中主鍵/唯一索引時生效,非主鍵條件常退化為表鎖/間隙鎖
- 大表
COUNT(*) 極慢,改用 EXPLAIN 估算行數、或維護計數表、或用 Redis 計數
資料庫規模控制
- 單實例 ≤ 150GB,超過拆實例
- 單庫 ≤ 300-400 張表(table_cache 壓力)
- 帶 char 字段表 ≤ 500 萬行,純數字主鍵表 ≤ 1000 萬行
- 一機器跑 7-8 實例,load avg 平時 1-2,峰值 ≤ 6-7
主從架構
- 多主庫便於水平擴展
replicate_do_db/table 讓從庫多線程並行追主,降低延遲(管理成本↑)
多 IDC 部署
分表策略
| 策略 | 適用場景 | 例子 |
| 按時間 | 日誌、流水、帳單 | 財經系統按月分表 |
| 按 ID Hash | 用戶、訂單、通行證 | 統一通行證 ID%100 |
| 按業務 | 獨立業務線 | 通用投票系統 |
MERGE 引擎加速開發
- 邏輯表映射多子表(如周一~周日離線消息),應用只查 MERGE 表
- 統計跨月報表:動態組合子表為 MERGE 表,無需改代碼
索引優化流程
- 復制表到測試環境
- 關閉 Query Cache 或用
SQL_NO_CACHE
- 基準測試:
EXPLAIN 看掃描行數、PROFILING 看耗時
- 加候選索引,
USE INDEX 強制驗證
- 迴歸測試,取最優
- 凌晨 2-3 點低峰上線
- 定期
OPTIMIZE TABLE(會鎖表,擇時執行)
排序分頁優化
- 盡量用主鍵排序
ORDER BY id
- 限制分頁深度(前 100 頁),防爬蟲觸發
LIMIT 1000000,20 全表掃描
批量寫入優化
| 組件 | 用途 | 例子 |
| Berkeley DB / Tokyo Tyrant / LightCloud | 簡單 KV 業務 | Session、計數器、配置 |
| Memcached / Redis | 高頻更新緩衝 | 閾值 500 次或 30 分鐘落地 DB |
| Heap 補丁 | 極高頻小表 | 用戶在線狀態、記憶體表 |
監控與 Profiling