(1) 所有環境的mysql版本使用5.6社群版,64位版本;
(2) 使用innodb儲存引擎;
(3) 資料庫字符集預設為utf8,字符集預設校驗規則為utf8_general_ci;
(4) 所有表、欄位都需要新增注釋;
(5) 單錶資料量控制在2000w以內;
(6) 隔離線上和線下,禁止線下直接連線線上庫,禁止在已上線庫上做壓力測試;
(1) 庫名、表名、欄位名建議不超過32個字元,可用單詞簡寫,但須見名之意;
(2) 庫名、表名、欄位名須使用小寫字母,「_」分割。
(3) 庫名、表名、欄位名禁止使用mysql保留字;
(4) 臨時庫、表名建議以tmp為字首,並以日期為字尾;
(5) 備份庫、表建議以bak為字首,並以日期為字尾;
(6) 使用時間分表,表名字尾建議使用特定格式,比如按年分表user_2016按月分表user_201602、按日分表user_20160209;
(1) 控制單庫的表數量,建議在400張表左右;
(2) 表字段數少而精,字段數量上限控制在50個;
(3) 字段資料型別長度選擇遵守夠用最小原則;
(4) 拆分大字段和訪問頻率低的字段,分離冷熱資料,拆分成兩張表;
(5) 用hash進行散表,表名字尾使用十進位制數,下標從0開始;
(6) 採用合適的分庫分表策略,例如十庫百錶等;
(7) 展示型**欄位可使用float和double型別儲存,用於計算的**字段建議用decimal型別儲存;
(8) 所有字段建議均定義為not null,null欄位難於查詢優化,null欄位的索引需要額外空間;
(9) 使用unsigned儲存非負整數;
(10) 使用varbinary儲存大小寫敏感的變長字串;
(11) 禁止在資料庫中儲存明文密碼,把密碼加密後儲存;
(12) 儲存ip最好用int儲存而非char(15)或者varchar(15);
(13) 儲存精確到秒的時間建議使用datetime,datetime和timestamp都是精確到秒,優先選擇datetime,因為timestamp只有4個位元組,儲存的最大值為2023年的某一天,而datetime 占用8個位元組。
(14) 盡量使用tinyint型別代替enum型別;
(15) 盡可能不使用text/blob型別,varchar的效能會比text/blob高很多,實在避免不了text/blob,請拆分表;
(16) 資料庫中禁止儲存大檔案,或者**,可以將大物件放到磁碟上,資料庫中儲存它的路徑;
1、索引命名:
非唯一索引建議以 idx_欄位1_欄位2命名,唯一所以建議以unq_欄位1_欄位2命名,索引名稱建議全部小寫;
2、索引的數量要控制:
(1) 單張表中索參數量盡量不超過5個,避免過多索引影響update、insert、delete的效能;
(2) 單個索引中的字段數盡量不超過5個;
(3) 對字串使用字首索引,字首索引長度不超過30個字元,短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作;
(4) 建議優先考慮字首索引,必要時可新增偽列並建立索引,多條字段重複的語句,要修改語句條件欄位的順序,為其建立一條聯合索引,但也避免冗餘索引;
3、主鍵準則:
(1)建議每張表都要有自增主鍵id int(11) unsigned,且與業務無關,not null auto_increment;
(2) 不使用更新頻繁的列作為主鍵;
(3) 盡量不選擇字串列作為主鍵;
(4) 不使用uuid md5 hash這些作為主鍵;
(5) 預設使用非空的唯一鍵作為主鍵;
4、多表join的字段注意以下:
(1) 區分度最大的字段放在前面;
(2) 核心sql優先考慮覆蓋索引;
(3) 避免冗餘和重複索引;
(4) 索引要綜合評估資料密度和分布以及考慮查詢和更新比例;
5、索引禁忌:
(1) 不在低基數列上建立索引,例如「性別」,「型別」等字段;
(2) 不在索引列進行數**算和函式運算,會導致索引失效而進行全表掃表;
6、盡量不使用外來鍵:
(1) 外來鍵用來保護資料一致性和完整性,由應用端實現;
(2) 對父表和子表的操作會相互影響,降低可用性;
7、索引欄位的預設值盡量不為null,要改為其他的預設值或者空串;
8、能使用唯一索引盡量使用唯一索引,提高查詢效率;
(1) sql語句盡可能簡單,大的sql想辦法拆成小的sql語句,可充分利用多核cpu;
(2) 事務要簡單,整個事務的時間長度不要太長;
(3) 盡量避免使用觸發器、函式、儲存過程;
(4) 降低業務耦合度,為sacle out、sharding留有餘地;
(5) 避免在資料庫中進行數**算(mysql不擅長數**算和邏輯判斷);
(6) 禁止用select *,查詢哪幾個欄位就select這幾個字段,減少cpu、io和網絡卡的壓力;
(7) in裡面數字的個數建議控制在1000以內;
(8) limit分頁注意效率,limit越大,效率越低;
(9) 避免使用大表的join;
(10) 使用group by 分組、自動排序;
(11) 對資料的更新要打散後批量更新,不要一次更新太多資料;
(12) 減少與資料庫的互動次數;
(13) sql語句不可以出現隱式轉換,比如 select id from tb where id=』1』;
(14) 在sql語句中,禁止使用字首是%的like,無法使用索引;
(15) 不使用負向查詢,如not in和%字首模糊查詢,導致全表掃瞄;
(16) 關於分頁查詢:程式裡建議合理使用分頁來提高limit效率,offset較大要配合子查詢使用;
(17) 禁止使用order by rand();
(18) 禁止單條sql語句同時更新多個表,易造成死鎖;
(19) 禁止在應用程式端顯式加鎖;
(1) 不在業務高峰期批量更新、查詢資料庫或者匯入匯出資料;
(2) 所有的建表操作需要提前告知,建議在建表的時候,新增對應列的索引;
(3) 所有的改表結構、加索引操作都需要將涉及到所改表的查詢sql發工單提前告知dba等相關人員,核心業務表或者大資料量表需要在業務低峰期進行;
(4) 批量匯入、匯出資料建議提前通知dba,並在業務低峰期進行;
(5) 禁止有super許可權的應用程式賬號存在;
(6) 推廣活動前通知dba即將到來的流量評估;
mysql資料庫操作規範 資料庫操作規範
1.涉及到寫入資料庫的操作,請務必使用 nohup 的方式 或者使用 操作終端pc機 客戶機房windows主機 資料庫伺服器主機 的連線模式 或者在資料庫伺服器上開乙個vnc。這裡的寫入資料庫的操作,1.涉及到寫入資料庫的操作,請務必使用 nohup 的方式 或者使用 操作終端pc機 客戶機房wi...
MYSQL資料庫開發規範
自己總結的mysql開發規範,夠用就行了。1 表 1.1 表必須要有主鍵,主鍵使用自動遞增,型別為int。1.2 表名使用有意義的英文單詞,可用下劃線分割。如需使用縮寫時,不可使用意義不明的縮寫。1.3 需要多表join的字段,資料型別保持絕對一致。1.4 字段命名時需要加上表名,確保所有表中的字段...
Mysql 資料庫開發規範
一 基礎規範 1 必須使用innodb儲存引擎 解讀 支援事務 行級鎖 併發效能更好 cpu及記憶體快取頁優化使得資源利用率更高 2 必須使用utf8字符集 解讀 萬國碼,無需轉碼,無亂碼風險,節省空間 3 資料表 資料字段必須加入中文注釋 解讀 n年後誰知道這個r1,r2,r3欄位是幹嘛的 4 禁...