本文件是為幫助研發與運維人員按照規範使用mysql資料庫,提公升研發寫sql的水平。致力於提供乙個安全,穩定,高效能的資料庫環境。
命名規範
1) 庫名、表名、欄位名必須使用小寫字母,"_"分割。
2) 庫名、表名、欄位名不超過12個字元。
3) 庫名、表名、欄位名禁止使用mysql保留字,見附件。
4) 庫名、表名、欄位名見名知意,建議使用名詞而不是動詞。
5) 資料物件、變數的命名都採用英文本元,禁止使用中文命名。
6) 臨時庫、表名必須以tmp為字首,並以日期為字尾。
7) 備份庫、表必須以bak為字首,並以日期為字尾。
基礎規範
1) 所有表統一使用innodb儲存引擎。
2) 表字符集選擇utf8mb4。
3) 所有表和列都需要新增注釋。
4) 禁止在資料庫中儲存、檔案。
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)。
mysql 的開發規範 MySQL開發規範
一 基礎規範 1 使用innodb儲存引擎 2 資料庫字符集使用utf8,校對字符集使用utf8 general ci 3 所有表 欄位都盡量新增注釋 4 庫名 表名 欄位名使用小寫字母,禁止超過32個字元,須見名知意 5 非唯一索引以 idx 欄位1 欄位2 命名,唯一索引必須以 uniq 欄位1...
MySQL開發規範
1 單張表中索參數量不超過5個 建議3個左右 如果超時,一般情況下表能夠進行二次拆分。2 單個索引中的字段數不超過5個 建議3個以內 3 對字串使 用字首索引。4 建議優先考慮字首索引,必要時可新增偽列並建立索引。1 表必須有主鍵。2 不使用更新頻繁的列作為主鍵。3 盡量不選擇字串列作為主鍵。4 不...
MySQL開發規範
1 庫名 表名 欄位名必須使用小寫字母並採用下劃線分割 2 庫名 表名 欄位名支援最多32個字元,統一規範 易於辨識以及減少傳輸量不要超過32 3 庫名 表名 欄位名禁止使用mysql保留關鍵字 4 臨時庫 臨時表名必須以tmp為字首並以日期為字尾 5 備份庫 備份表名必須以bak為字首並以日期為字...