一、基礎(chǔ)規(guī)范
表字符集使用 UTF8
所有表都需要添加注釋
不在數(shù)據(jù)庫(kù)中存儲(chǔ)圖?蛇数、文件等大數(shù)據(jù)
禁止在線上做數(shù)據(jù)庫(kù)壓力測(cè)試
禁?從測(cè)試、開(kāi)發(fā)環(huán)境直連數(shù)據(jù)庫(kù)
二、命名規(guī)范
庫(kù)名表名字段名必須有固定的命名長(zhǎng)度啸箫,12個(gè)字符以內(nèi)
庫(kù)名、表名伞芹、字段名禁?止超過(guò)32個(gè)字符忘苛。須見(jiàn)名之意
庫(kù)名、表名唱较、字段名禁?止使?用MySQL保留字
臨時(shí)庫(kù)扎唾、表名必須以tmp為前綴,并以?日期為后綴
備份庫(kù)南缓、表必須以bak為前綴胸遇,并以日期為后綴
表名以 t_ 或者模塊名(或者模塊名(如 cms_))
字段名稱可讀性要高,多個(gè)單詞需用“ _”分割
表名和所有字段都要注釋汉形, 配置項(xiàng)的還需具體值含義表名和所有字段都要注釋? 如:文章?tīng)顟B(tài) :1.已發(fā)送纸镊, 2. 未發(fā)送, 3. 草稿
三概疆、庫(kù)逗威、表、字段開(kāi)發(fā)設(shè)計(jì)規(guī)范
盡可能不使用 TEXT 岔冀、 BLOB 類型
用 DECIMAL 代替 FLOAT 和 DOUBLE 存儲(chǔ)精確浮點(diǎn)數(shù)
越簡(jiǎn)單越好:將字符轉(zhuǎn)化為數(shù)字凯旭、使用 TINYINT 來(lái)代替 ENUM 類型
所有字段均定義為 NOT NULL
INT類型固定占用 4? 字節(jié)存儲(chǔ)
使用 timestamp 存儲(chǔ)時(shí)間
使用 VARBINARY 存儲(chǔ)大小寫(xiě)敏感的變長(zhǎng)字符串
禁止在數(shù)據(jù)庫(kù)中存儲(chǔ)明文密碼,把密碼加密后存儲(chǔ)
避免使用 NULL 字段, NULL 字段很難查詢優(yōu)化尽纽,NULL字段的索引需要額外空間咐蚯,NULL字段的復(fù)合索引無(wú)效
少用 text/blob , varchar 的性能會(huì)比 text 高很多弄贿,實(shí)在避免不了blob春锋,請(qǐng)拆表
數(shù)據(jù)庫(kù)中不允許存儲(chǔ)大文件,或者照片差凹,可以將大對(duì)象放到磁盤(pán)上期奔,數(shù)據(jù)庫(kù)中存儲(chǔ)它的路徑
四、索引規(guī)范
1危尿、索引的數(shù)量要控制:
張表中索引數(shù)量不超過(guò)6個(gè)
單個(gè)索引中的字段數(shù)不超過(guò)5個(gè)
對(duì)字符串使?用前綴索引呐萌,前綴索引長(zhǎng)度不超過(guò)8個(gè)字符
2、主鍵準(zhǔn)則
表必須有主鍵
不使用更新頻繁的列作為主鍵
盡量不選擇字符串列作為主鍵
默認(rèn)使?非空的唯一鍵作為主鍵
建議選擇自增或發(fā)號(hào)器
3谊娇、多表JOIN的字段注意以下
區(qū)分度最大的字段放在前面
核?SQL優(yōu)先考慮覆蓋索引
避免冗余和重復(fù)索引
4肺孤、索引禁忌
不在低基數(shù)列上建立索引,例如“性別”
不在索引列進(jìn)行數(shù)學(xué)運(yùn)算和函數(shù)運(yùn)算
5济欢、索引命名:
非唯一索引必須以idx_字段1命名赠堵,唯一所以必須以 uniq_字段1? 命名,索引名稱必須全部小寫(xiě)
索引字段的默認(rèn)值不能為 NULL 法褥,要改為其他的 default 或者空茫叭。 NULL 非常影響索引的查詢效率
6、能使用唯一索引就要使用唯一索引半等,提高查詢效率
五揍愁、SQL規(guī)范
禁止使用SELECT *,只獲取必要的字段杀饵,需要顯示說(shuō)明列屬性
SQL語(yǔ)句盡可能簡(jiǎn)單莽囤,大的SQL想辦法拆成小的SQL語(yǔ)句
避免使用觸發(fā)器、函數(shù)凹髓、存儲(chǔ)過(guò)程
SQL中使用到OR的改寫(xiě)為用IN()(OR的效率沒(méi)有IN 的效率高)
in里面數(shù)字的個(gè)數(shù)建議控制在 1000 以內(nèi)
LIMIT分頁(yè)注意效率烁登。LIMIT越大,效率越低蔚舀《祝可以改寫(xiě) LIMIT ,比如例子改寫(xiě):
SELECT id FROM t LIMIT 10000, 10; => SELECT id FROM t WHERE id > 10000 LIMIT 10;
使用 UNION ALL 替代? UNION
避免使用大表的 JOIN
使用 GROUP BY 分組赌躺、自動(dòng)排序
SQL語(yǔ)句不可以出現(xiàn)隱式轉(zhuǎn)換狼牺,比如 SELECT id FROM TABLE WHERE id='1'
使用EXIST代替IN,EXIST在一些場(chǎng)景查詢會(huì)比IN快
能不用 NOT IN 就不用 NOTIN 礼患,坑太多了是钥。掠归。會(huì)把空和NULL給查出來(lái)
禁?單條SQL語(yǔ)句同時(shí)更新多個(gè)表
禁止%開(kāi)頭的模糊查詢,會(huì)導(dǎo)致全表掃描
避免使用用子查詢悄泥,改用join
六虏冻、流程規(guī)范
所有的建表操作需要提前告知該表涉及的查詢SQL;
所有的建表需要確定建立哪些索引后才可以建表上線弹囚;
所有的改表結(jié)構(gòu)厨相、加索引操作都需要將涉及到所改表的查詢SQL發(fā)出來(lái)告知相關(guān)人員;
不在業(yè)務(wù)高峰期批量更新鸥鹉、查詢數(shù)據(jù)庫(kù)