一、表設計與存儲引擎
- 引擎選型: InnoDB 覆蓋 95% 場景(事務/行鎖/崩潰恢復),MyISAM 僅限只讀歸檔
- 拒絕全表掃描: WHERE/Order By/Group By 欄位**必加索引**
- 索引節制: 單表 ≤ 5 個索引,每索引 ≤ 5 列,權衡寫入性能
- 拒絕 NULL: 定義
NOT NULL DEFAULT '',NULL 需額外位圖、統計複雜、索引失效風險
- 字符類型精準選: 定長
CHAR、變長 VARCHAR、大文本 TEXT,**長度剛好夠用**
- 命名規範: 小寫+下劃線、見名知意、
idx_/uk_/pk_ 前綴
二、SQL 編寫鐵律
- 拒絕 <>/!=/NOT IN: 導致全表掃描,改用
IN/EXISTS/範圍查詢
- WHERE 列不加函數/運算:
WHERE DATE(created)='2024-01-01' → 索引失效,改 WHERE created >= '2024-01-01' AND created < '2024-01-02'
- LIKE 僅後置 %:
name LIKE 'abc%' 走索引,%abc% 全掃
- BETWEEN 優於 IN: 連續範圍用 BETWEEN,優化器更易走索引範圍掃描
- SELECT 禁用 *: 顯式列出所需列,減少網絡/IO/內存,利於覆蓋索引
- 大結果集必 LIMIT: 防止客戶端 OOM、網絡阻塞
- 刪表用 TRUNCATE: 非事務、不記 Binlog、瞬間完成,
DELETE 逐行刪、產生大量 Binlog
- 預處理語句: 相同邏輯不同參數用
PreparedStatement,省解析/優化時間,防注入
三、連接與架構層
- 連接池必用: HikariCP/Druid,配置
maximumPoolSize、idleTimeout、maxLifetime
- 讀寫分離: SELECT 走從庫,寫入走主庫,中間件 ProxySQL/MyCat/ShardingSphere
- 分庫分表: 單表 > 2000萬/單庫 > 500GB 考慮分片,分片鍵業務隔離度高
- 緩存策略: 熱點數據 Redis 緩存,
Cache-Aside 模式,雙寫一致性補償
- 釋放資源: ResultSet/Statement/Connection 用完即關,try-with-resources / finally
- 大批量操作分批: DELETE/INSERT 分批 1000-5000 行,事務提交,
usleep 讓出 CPU
四、避坑補充
- 慢查詢日志必開:
long_query_time=1、log_queries_not_using_indexes=ON、定期 pt-query-digest 分析
- 監控全覆蓋: QPS/TPS、慢查詢數、連接數、主從延遲、Buffer Pool 命中率、磁碟 IOPS/利用率
- 定期演練: PITR 恢復、主從切換、大表 DDL、故障注入,驗證預案有效性
總結
這 23 條鐵律覆蓋**設計、開發、運維、架構**全生命周期。**不求一次做到完美,但求每次 Code Review、每次架構評審、每次故障復盤都對照清單**,性能優化從「臨時抱佛腳」變為「系統工程」。