MySQL开发规范
本文檔是為幫助研發(fā)與運(yùn)維人員按照規(guī)范使用MySQL數(shù)據(jù)庫(kù),提升研發(fā)寫SQL的水平。致力于提供一個(gè)安全,穩(wěn)定,高性能的數(shù)據(jù)庫(kù)環(huán)境。
命名規(guī)范
1) 庫(kù)名、表名、字段名必須使用小寫字母,"_"分割。
2) 庫(kù)名、表名、字段名不超過12個(gè)字符。
3) 庫(kù)名、表名、字段名禁止使用MySQL保留字,見附件。
4) 庫(kù)名、表名、字段名見名知意,建議使用名詞而不是動(dòng)詞。
5) 數(shù)據(jù)對(duì)象、變量的命名都采用英文字符,禁止使用中文命名。
6) 臨時(shí)庫(kù)、表名必須以tmp為前綴,并以日期為后綴。
7) 備份庫(kù)、表必須以bak為前綴,并以日期為后綴。
基礎(chǔ)規(guī)范
1) 所有表統(tǒng)一使用InnoDB存儲(chǔ)引擎。
2) 表字符集選擇UTF8mb4。
3) 所有表和列都需要添加注釋。
4) 禁止在數(shù)據(jù)庫(kù)中存儲(chǔ)圖片、文件。
5) 禁止在線上做數(shù)據(jù)庫(kù)壓力測(cè)試,如有特殊需要,需提前報(bào)備。
6) 禁止客戶端直接操作測(cè)試,生產(chǎn)數(shù)據(jù)庫(kù)。
7) 研發(fā)保證應(yīng)用與數(shù)據(jù)庫(kù)表結(jié)構(gòu)版本的統(tǒng)一,并提供相應(yīng)的數(shù)據(jù)庫(kù)回滾策略。
8) 表結(jié)構(gòu)變更DBA審核未通過的,不允許上線。
字段設(shè)計(jì)規(guī)范
1) 每張表必須有整型主鍵。如:id bigint(20) UNSIGNED , NOT NULL,不要自增。
2) 禁止DEFAULT NULL,建議NOT NULL 設(shè)置默認(rèn)值。
3) 存儲(chǔ)精確浮點(diǎn)數(shù)必須使用DECIMAL替代FLOAT和DOUBLE,或者使用bigint(需要做轉(zhuǎn)換)。
4) 建議使用UNSIGNED存儲(chǔ)非負(fù)數(shù)值。
5) 不建議使用ENUM類型,使用TINYINT來代替。
6) 建議使用INT UNSIGNED存儲(chǔ)IPV4。
7) 禁止在數(shù)據(jù)庫(kù)中存儲(chǔ)明文密碼。
8) 整形定義中建議采用INT(10),而不是INT(1),INT(11)或其他。
9) 存儲(chǔ)狀態(tài),性別等,用TINYINT。
10) 將過大字段拆分到其他表中。盡可能不使用TEXT、BLOB類型。如果必須使用,業(yè)務(wù)表中的TEXT,BLOB中字段,必須要拆分到單獨(dú)的表中存儲(chǔ)。
11) 需要根據(jù)實(shí)際的寬度來選擇VARCHAR(N)類型的寬度。
12) N表示的是字符數(shù)不是字節(jié)數(shù). VARCHAR(N),N盡可能小,進(jìn)行排序和創(chuàng)建臨時(shí)表一類的內(nèi)存操作時(shí),會(huì)使用N的長(zhǎng)度申請(qǐng)內(nèi)存。
13) 存儲(chǔ)年使用YEAR類型,存儲(chǔ)日期使用DATE類型。
14) 13 存儲(chǔ)時(shí)間(精確到秒)建議使用TIMESTAMP類型,因?yàn)門IMESTAMP使用4字節(jié),DATETIME使用8個(gè)字節(jié)。TIMESTAMP類型保存的值不能比1970早或比2037晚。
一句話總結(jié):
? 能NOT NULL 就NOT NULL,char、varchar用NOT NULL DEFAULT '',tinyint、smallint、int用NOT NULL DEFAULT 0。
? char、varchar取值要吝嗇,根據(jù)實(shí)際需求給,比如人名一般不超過5個(gè),varchar(5),不要varchar(200)。int、tinyint這類,int(1)和int(13)都是一樣的,
? 我們統(tǒng)一用int(10),tinyint取值范圍[-128,127],加了unsigned取值[0,255],如果不需要存儲(chǔ)負(fù)數(shù),整型類型的加unsigned。
索引規(guī)范
1) 單張表的索引數(shù)量控制在5個(gè)以內(nèi)。
2) 復(fù)合索引中的字段數(shù)建議不超過5個(gè)。
3) 非唯一索引必須按照"idx_字段名稱_字段名稱[_字段名]"進(jìn)行命名。
4) 唯一索引必須按照"uniq_字段名稱_字段名稱[_字段名]"進(jìn)行命名。
5) 合理利用覆蓋索引。不使用更新頻繁的列做為索引。
6) 對(duì)長(zhǎng)字符串考慮使用前綴索引,前綴索引長(zhǎng)度不超過8個(gè)字符。
7) 索引字段的順序需要考慮字段值去重之后的個(gè)數(shù),個(gè)數(shù)多的放在前面。
8) 使用EXPLAIN判斷SQL語句是否合理使用索引,盡量避免extra列出現(xiàn):Using File Sort,UsingTemporary。
9) UPDATE、DELETE語句需要根據(jù)WHERE條件添加索引。
10) 合理創(chuàng)建聯(lián)合索引(避免冗余),(a,b,c) 相當(dāng)于 (a) 、(a,b) 、(a,b,c),但(a,c)只能用到部分索引。
索引禁忌
1) 不在選擇性低的列上建立索引,例如"性別", "狀態(tài)", "類型"。
2) 不在索引列進(jìn)行數(shù)學(xué)運(yùn)算和函數(shù)運(yùn)算。
3) 盡量不使用外鍵。
4) 高并發(fā)場(chǎng)景不建議使用唯一索引。
5) 不使用前導(dǎo)查詢,如like "%ab",like "%ab%"。
6 SQL語句規(guī)范
1) SQL語句中IN包含的值不應(yīng)過多(不超過1000個(gè))
2) UPDATE、DELETE語句不使用LIMIT。
3) WHERE條件中必須使用合適的類型,避免MySQL進(jìn)行隱式類型轉(zhuǎn)化。
4) SELECT語句只獲取需要的字段。
5) SELECT、INSERT語句必須顯式的指明字段名稱,不使用SELECT *,不使用INSERT INTO table()。
6) WHERE條件中的非等值條件(IN、BETWEEN、<、<=、>、>=)會(huì)導(dǎo)致后面的條件使用不了索引。
7) 避免在SQL語句進(jìn)行數(shù)學(xué)運(yùn)算或者函數(shù)運(yùn)算,容易將業(yè)務(wù)邏輯和DB耦合在一起。
8) INSERT語句使用batch提交(INSERT INTO table VALUES(),(),()……),values的個(gè)數(shù)不應(yīng)過多。
9) 避免使用存儲(chǔ)過程、觸發(fā)器、函數(shù)等,容易將業(yè)務(wù)邏輯和DB耦合在一起,并且MySQL的存儲(chǔ)過程、觸發(fā)器、函數(shù)中存在一定的bug。
10) 避免使用JOIN。
11) 使用合理的SQL語句減少與數(shù)據(jù)庫(kù)的交互次數(shù)。
12) 不使用ORDER BY RAND(),使用其他方法替換。
13) 建議使用合理的分頁(yè)方式以提高分頁(yè)的效率。
14) 統(tǒng)計(jì)表中記錄數(shù)時(shí)使用COUNT(*),而不是COUNT(primary_key)和COUNT(1)。
轉(zhuǎn)載于:https://www.cnblogs.com/jun1019/p/9353862.html
總結(jié)
- 上一篇: 负载均衡 LVS
- 下一篇: scanf函数和cin的区别、类的数组、