
核心軍規
- 儘可能不在數據庫作運算
- 控制單表數據量 純INT不超過10M條,含Char不超過5M條
- 保持表身段苗條
- 平衡範式和冗餘
- 拒絕大SQL,復瑣事務,大批量任務
字段類軍規
- 用好數值字段,儘可能簡化字段位數
- 把字符轉化爲數字
- 優先使用Enum或Set
- 避免使用Null字段
- 少用並拆封Text/Blob
- 不在數據庫中存圖片
索引類軍規
- 謹慎合理添加索引
- 字符字段必須創建前綴索引?
- 不在索引列作運算
- 自增列或全局ID作InnoDB主鍵
- 儘可能不用外鍵
SQL類軍規
- SQL儘量簡單
- 保持事務鏈接短小
- 儘量避免使用SP/Trigger/Function
- 儘可能不用Select *
- 改寫Or爲IN()
- 改寫Or爲Union
- 避免負向查詢和%前綴模糊查詢
- Count不要使用在可Null的字段上面
- 減小Count(*)
- Limit高效分頁,SELECT * FROM message WHERE id > 9527 (or sub select) limit 10
- 使用Union ALL 而不用Union
- 分解連接,保證高併發
- Group By 去除排序
- 同數據類型的列值比較
- Load Data導入數據,比Insert快20倍
- 打散大批量更新,儘可能凌晨操做
約定類軍規
- 隔離線上線下
- 禁止未經DBA認證的子查詢
- 永遠不在程序段顯式加鎖
- 表字符集統一使用UTF8MB4
統一使用UTF8MB4 for by 可能還有人不知道,MySQL 數據庫的字符集,要用 utf8mb4,而不是utf8。由於MySQL的utf8不是真正的UTF-8,只支持最多三個字節的字符。真正的UTF-8可能會出現四個字節的字符。MySQL 歷來沒有修復這個 Bug,而是使用另外的解決方法:真正的UTF-8字符集用 utf8mb4的名字提供。sql