MySQL開發規范


本文檔是為幫助研發與運維人員按照規范使用MySQL數據庫,提升研發寫SQL的水平。致力於提供一個安全,穩定,高性能的數據庫環境。

命名規范
1) 庫名、表名、字段名必須使用小寫字母,"_"分割。
2) 庫名、表名、字段名不超過12個字符。
3) 庫名、表名、字段名禁止使用MySQL保留字,見附件。
4) 庫名、表名、字段名見名知意,建議使用名詞而不是動詞。
5) 數據對象、變量的命名都采用英文字符,禁止使用中文命名。
6) 臨時庫、表名必須以tmp為前綴,並以日期為后綴。
7) 備份庫、表必須以bak為前綴,並以日期為后綴。

基礎規范
1) 所有表統一使用InnoDB存儲引擎。
2) 表字符集選擇UTF8mb4。
3) 所有表和列都需要添加注釋。
4) 禁止在數據庫中存儲圖片、文件。
5) 禁止在線上做數據庫壓力測試,如有特殊需要,需提前報備。
6) 禁止客戶端直接操作測試,生產數據庫。
7) 研發保證應用與數據庫表結構版本的統一,並提供相應的數據庫回滾策略。
8) 表結構變更DBA審核未通過的,不允許上線。

字段設計規范
1) 每張表必須有整型主鍵。如:id bigint(20) UNSIGNED , NOT NULL,不要自增。
2) 禁止DEFAULT NULL,建議NOT NULL 設置默認值。
3) 存儲精確浮點數必須使用DECIMAL替代FLOAT和DOUBLE,或者使用bigint(需要做轉換)。
4) 建議使用UNSIGNED存儲非負數值。
5) 不建議使用ENUM類型,使用TINYINT來代替。
6) 建議使用INT UNSIGNED存儲IPV4。
7) 禁止在數據庫中存儲明文密碼。
8) 整形定義中建議采用INT(10),而不是INT(1),INT(11)或其他。
9) 存儲狀態,性別等,用TINYINT。
10) 將過大字段拆分到其他表中。盡可能不使用TEXT、BLOB類型。如果必須使用,業務表中的TEXT,BLOB中字段,必須要拆分到單獨的表中存儲。
11) 需要根據實際的寬度來選擇VARCHAR(N)類型的寬度。
12) N表示的是字符數不是字節數. VARCHAR(N),N盡可能小,進行排序和創建臨時表一類的內存操作時,會使用N的長度申請內存。
13) 存儲年使用YEAR類型,存儲日期使用DATE類型。
14) 13 存儲時間(精確到秒)建議使用TIMESTAMP類型,因為TIMESTAMP使用4字節,DATETIME使用8個字節。TIMESTAMP類型保存的值不能比1970早或比2037晚。

一句話總結:
 能NOT NULL 就NOT NULL,char、varchar用NOT NULL DEFAULT '',tinyint、smallint、int用NOT NULL DEFAULT 0。
 char、varchar取值要吝嗇,根據實際需求給,比如人名一般不超過5個,varchar(5),不要varchar(200)。int、tinyint這類,int(1)和int(13)都是一樣的,
 我們統一用int(10),tinyint取值范圍[-128,127],加了unsigned取值[0,255],如果不需要存儲負數,整型類型的加unsigned。

索引規范
1) 單張表的索引數量控制在5個以內。
2) 復合索引中的字段數建議不超過5個。
3) 非唯一索引必須按照"idx_字段名稱_字段名稱[_字段名]"進行命名。
4) 唯一索引必須按照"uniq_字段名稱_字段名稱[_字段名]"進行命名。
5) 合理利用覆蓋索引。不使用更新頻繁的列做為索引。
6) 對長字符串考慮使用前綴索引,前綴索引長度不超過8個字符。
7) 索引字段的順序需要考慮字段值去重之后的個數,個數多的放在前面。
8) 使用EXPLAIN判斷SQL語句是否合理使用索引,盡量避免extra列出現:Using File Sort,UsingTemporary。
9) UPDATE、DELETE語句需要根據WHERE條件添加索引。
10) 合理創建聯合索引(避免冗余),(a,b,c) 相當於 (a) 、(a,b) 、(a,b,c),但(a,c)只能用到部分索引。

索引禁忌
1) 不在選擇性低的列上建立索引,例如"性別", "狀態", "類型"。
2) 不在索引列進行數學運算和函數運算。
3) 盡量不使用外鍵。
4) 高並發場景不建議使用唯一索引。
5) 不使用前導查詢,如like "%ab",like "%ab%"。
6 SQL語句規范
1) SQL語句中IN包含的值不應過多(不超過1000個)
2) UPDATE、DELETE語句不使用LIMIT。
3) WHERE條件中必須使用合適的類型,避免MySQL進行隱式類型轉化。
4) SELECT語句只獲取需要的字段。
5) SELECT、INSERT語句必須顯式的指明字段名稱,不使用SELECT *,不使用INSERT INTO table()。
6) WHERE條件中的非等值條件(IN、BETWEEN、<、<=、>、>=)會導致后面的條件使用不了索引。
7) 避免在SQL語句進行數學運算或者函數運算,容易將業務邏輯和DB耦合在一起。
8) INSERT語句使用batch提交(INSERT INTO table VALUES(),(),()……),values的個數不應過多。
9) 避免使用存儲過程、觸發器、函數等,容易將業務邏輯和DB耦合在一起,並且MySQL的存儲過程、觸發器、函數中存在一定的bug。
10) 避免使用JOIN。
11) 使用合理的SQL語句減少與數據庫的交互次數。
12) 不使用ORDER BY RAND(),使用其他方法替換。
13) 建議使用合理的分頁方式以提高分頁的效率。
14) 統計表中記錄數時使用COUNT(*),而不是COUNT(primary_key)和COUNT(1)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM