架構之路-SQL規範

目錄

一.命名規範:

二.表結構規範:

三.索引使用規範:

四.SQL編寫規範:


一.命名規範:

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,過大會導致性能問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章