目錄
一.命名規範:
1 |
庫 |
a.不使用MySQL保留字 b.使用小寫字母 c.清晰明瞭,根據業務線,環境進行定義 d.使用_分割 |
2 |
表 |
a.不使用MySQL保留字 b.使用小寫字母 c.清晰明瞭,根據業務進行定義 d.使用_分割 |
3 |
字段 |
a.不使用MySQL保留字 b.使用小寫字母 c.清晰明瞭,根據存儲內容進行定義 d.使用_分割 |
4 |
索引 |
a.二級索引: idx_column1_column2 b.唯一索引: uniq_column1_column2 |
二.表結構規範:
1 |
類型簡單化 |
越簡單的類型佔用越少的CPU週期和IO, int優於varchar |
2 |
數據類型儘量小 |
越小的數據類型佔用越少的CPU週期和IO,tinyint優於int |
3 |
字符串類型 |
a.varchar(x) x代表字符數,儘量使用正確的長度,utf8下,一個漢字字符佔用三個字節,utf8mb4下,一個漢字字符佔用四個字節; b.varchar(25)優於varchar(255):存儲同樣長度的字段時,佔用相同的磁盤資源,但是varchar(255)佔用更多的內存 c.varchar(255)優於varchar(256) :varchar會使用額外的空間來記錄自身的長度,varchar(255)使用一個字節,varchar(256)使用兩個字節;在進行表結構變更時,varchar(255)比varchar(256)更快速,不會影響服務器性能;utf8mb4下,建議varchar(191); d.使用varchar來記錄電話號碼,以兼容+86等情況 |
4 |
枚舉類型 |
a.使用tinyint來存儲枚舉類型,性能要高於enum及varchar類型 |
5 |
數字類型 |
a.可以爲整數類型指定寬度,但是沒有意義,不會限制值的合法範圍 b.可以使用unsigned只存正數,來提升存儲範圍,有符號和無符號使用相同的存儲空間,具有同樣的性能 c.ipv4地址建議用int類型存儲 int佔用4字節,char(15)佔用至少15字節,一億行記錄下存儲空間會多出1.1G |
6 |
時間類型 |
a.儘量使用timestamp類型:timestamp佔用4個字節存儲,優於datetime佔用8個字節存儲;datetime由date和time兩個函數組成,耗費更多的CPU週期;timestamp具有時區功能 b.每行需增加行創建時間: create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', c.每行需增加行更新時間: modify_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間' d.timestamp的可存儲時間範圍爲 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’ ,當超出這個範圍,可以使用datetime替換timestamp |
7 |
行定義 |
a.字段必須定義NOT NULL b.字段必須有默認值,建議:數字是0,字符串可以是 '' c.主鍵儘量使用系統默認的自增主鍵:ID bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵' d.禁止使用外鍵 e.適當進行列的冗餘,在範式設計和性能之間進行平衡 f.每個字段必須填寫註釋,枚舉類型字段,要註釋清楚枚舉值:COMMENT='實名狀態,0 … 1… …9…' |
8 |
其他 |
a.建表:ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用戶表' b.默認使用utf8mb4字符集: DEFAULT CHARSET=utf8mb4 c.默認使用InnoDB存儲引擎: ENGINE=InnoDB d.表結構必須填寫表的註釋:COMMENT='用戶表' |
三.索引使用規範:
1.使用過多的索引會降低表的插入速度,建議索引總數量不超過5個
2.辨識度低的列,不需要使用索引,如性別
3.儘量複用索引,不要造成冗餘索引
4.聯合索引必須控制列的數量,建議聯合索引的長度不超過4個字段
5.建立聯合索引需要根據複用及辨識度選擇列的順序
6.爲提升性能,儘量在其他條件允許下使用覆蓋索引
四.SQL編寫規範:
1.只允許簡單查詢,不允許join及子查詢,join操作請放在應用端實現
2.禁止使用函數,函數運算在應用端進行,在索引列中作運算, 無法利用索引
3.高頻的query應加入到緩存當中
4.禁止使用觸發器及存儲過程,視圖
5.禁止使用like %xx這樣無法使用到索引的模糊查詢,建議這種使用場景使用ES存儲
6.禁止使用select * ,需指定具體需要取出的列
7.insert必須指定字段,不能單純使用insert .. values()
8.update、delete必須指定where,必須加limit
9.必須正確的使用字段類型,字符串必須加‘’
10.禁止負向查詢 NOT != <> !<等 ,可以改爲 in 等查詢方式
11.控制in()的數量,不要超過500,過大會導致性能問題