建表規範
存儲引擎:
- 表的存儲引擎必須選擇InnoDB
- 每一個Innodb表都必須要有主鍵
字符集:
- 表的字符集都選擇utf-8
- 如果有需要存儲emoji可以使用utf8mb4
索引:
- 單表的索引個數最好不要超過5個
- 儘量使用複合索引,而不是添加新的索引
- 不要在索引列上使用數學運算和函數運算
- 注意組合索引的順序,以便利用索引的最左原則
字段:
- 一張表的字段個數最好不要超過50個
- 所有表和字段都需要添加中文註釋
- 用DECIMAL代替FLOAT和DOUBLE存儲精確浮點數
- 使用TINYINT來代替ENUM類型
- 字段長度儘量按實際需要進行分配,不要隨意分配一個很大的容量
- 字段定義爲NOT NULL要提供默認值
- 儘可能不使用TEXT、BLOB類型
- 每張表數據量建議控制在5000W以內
- 區分使用TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT數據類型。例如取值範圍爲0-80時,使用TINYINT UNSIGNED
- 區分使用DATETIME和TIMESTAMP。存儲年使用YEAR類型。存儲日期使用DATE類型。 存儲時間(精確到秒)建議使用TIMESTAMP類型
存儲:
- 不在數據庫中存儲圖片、文件等大數據
- 避免使用存儲過程、視圖、觸發器、事件
外鍵:
- 避免使用外鍵,外鍵用來保護參照完整性,可在業務端實現
查詢規範
- 禁止使用select *,要查詢數據後面必須緊跟字段值
- 避免使用負向查詢,例如 not in、!=、not like,否則容易造成全表掃描
- 避免使用%前導查詢,例如:like “%abc”,無法利用到索引
- SQL中避免出現now()、rand()、sysdate()、current_user()等不確定結果的函數
- 拆分複雜SQL爲多個小SQL,避免大事務
- 禁止使用order by rand()
- 儘量用IN來替換OR
- 儘量避免多表Join查詢