MySQL開發規範

MySQL開發規範

一、命名規範

1、庫名、表名、字段名必須使用小寫字母並採用下劃線分割;
2、庫名、表名、字段名支持最多32個字符,統一規範、易於辨識以及減少傳輸量不要超過32;
3、庫名、表名、字段名禁止使用MySQL保留關鍵字;
4、臨時庫、臨時表名必須以tmp爲前綴並以日期爲後綴;
5、備份庫、備份表名必須以bak爲前綴並以日期爲後綴;

二、基本規範

1、使用INNODB存儲引擎
5.5以後的默認引擘,支持事務,行級鎖,更好的恢復性,高併發下性能更好,對多核,大內存,ssd等硬件支持更好;
2、表字符集使用UTF8
使用utf8字符集,如果是漢字,佔3個字節,但ASCII碼字符還是1個字節;統一,不會有轉換產生亂碼風險;
3、所有表都需要添加註釋,單表數據量建議控制在500萬以內;
4、不在數據庫中存儲圖片、文件等大數據;
5、禁止在線上做數據庫壓力測試;
6、禁止從測試、開發環境直連線上數據庫;

三、庫表設計規範

1、禁止使用分區表
MySQL的分區表實際性能不是很好,且管理維護成本較高
2、拆分大字段和訪問頻率低的字段,分離冷熱數據
3、採用合理的分庫分表策略,推薦使用HASH進行分表,表名後綴使用十進制數,下標從0開始
首次分表儘量多的分,避免二次分表,二次分表的難度和成本較高
4、按日期時間分表需符合YYYY[MM][DD][HH]格式
5、單表字段數控制在20個以內
6、一條完整的建表語句中應包含必要的字段、主鍵、合理的索引(綜合代碼中所有的條件語句創建合理的索引)

四、索引設計規範

索引是一把雙刃劍,它可以提高查詢效率但也會降低插入和更新的速度並佔用磁盤空間
1、單張表中索引數量不超過5個;
2、單個索引中的字段數不超過5個;
對字符串使用前綴索引,前綴索引長度不超過10個字符;如果有一個CHAR(200)列,如果在前10個字符內,多數值是惟一的,那麼就不要對整個列進行索引。對前10個字符進行索引能夠節省大量索引空間,也可能會使查詢更快;
3、表必須有主鍵,不使用UUID、MD5、HASH作爲主鍵,儘量不選擇字符串列作爲主鍵;主鍵建議選擇自增id;
4、創建複合索引時區分度較大的字段放在最前面;不在低區分度的字段上創建索引,例如‘性別‘;
5、避免冗餘或重複索引
合理創建聯合索引(避免冗餘),index(a,b,c)相當於index(a)、index(a,b)、index(a,b,c);
6、索引不是越多越好,按實際需要進行創建
每個額外的索引都要佔用額外的磁盤空間,並降低寫操作的性能
7、不在索引列進行數學運算和函數運算;
8、儘量不要使用外鍵
外鍵用來保護參照完整性,可在業務端實現,對父表和子表的操作會相互影響,降低可用性;
9、不使用%前導的查詢,如like“%xxx”,無法使用索引;
10、不使用反向查詢,如not in / not like
無法使用索引,導致全表掃描
全表掃描導致buffer pool利用降低

五、字段設計規範

1、儘可能不要使用TEXT、BLOB類型
刪除這種值會在數據表中留下很大的"空洞",可以考慮把BLOB或TEXT列分離到單獨的表中
2、用DECIMAL代替FLOAT和DOUBLE存儲精確浮點數
浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的數據範圍;浮點數的缺點是會引起精度問題
3、將字符轉化爲數字
4、使用TINYINT來代替ENUM類型
5、字段長度儘量按實際需要進行分配,不要隨意分配一個很大的容量
VARCHAR(N),N表示的是字符數不是字節數,比如VARCHAR(255),可以最大可存儲255個漢字,需要根據實際的寬度來選擇N;
VARCHAR(N),N儘可能小,因爲MySQL一個表中所有的VARCHAR字段最大長度是65535個字節,進行排序和創建臨時表一類的內存操作時,會使用N的長度申請內存;
6、如果可能的話所有字段均定義爲not null
7、使用UNSIGNED存儲非負整數
同樣的字節數,存儲的數值範圍更大。如tinyint有符號爲-128-127,無符號爲0-255
8、使用TIMESTAMP存儲時間. 因爲TIMESTAMP使用4字節,DATETIME使用8個字節,同時TIMESTAMP具有自動賦值以及自動更新的特性.
9、使用INT UNSIGNED存儲IPV4
10、使用VARBINARY存儲大小寫敏感的變長字符串
11、禁止在數據庫中存儲明文密碼

六、SQL設計規範

1、使用預編譯語句prepared statement
只傳參數,比傳遞SQL語句更高效,一次解析,多次使用,降低SQL注入概率
2、儘量避免相同語句由於書寫格式的不同,而導致多次語法分析
3、避免隱式轉換
會導致索引失效,如select userid from table where userid=’ 1234’
4、充分利用前綴索引
必須是最左前綴,不可能同時用到兩個範圍條件
5、避免使用存儲過程、觸發器、EVENTS等
讓數據庫做最擅長的事,降低業務耦合度,爲sacle out、shading留點餘地,避開BUG
6、避免使用大表的join
MySQL最擅長的是單表的主鍵/二級索引查詢
Join消耗較多的內存,產生臨時表
7、避免在數據庫中進行數學運算
容易將業務邏輯和DB耦合在一起
MySQL不擅長數學運算和邏輯判斷
無法使用索引
8、拒絕大SQL,拆分成小SQL
充分利用query cache
充分利用多核CUP
9、使用in代替or,in的值不超過1000個
10、禁止使用order by rand()
因爲ORDER BY rand()會將數據從磁盤中讀取,進行排序,會消耗大量的IO和CPU,可以在程序中獲取一個rand值,然後通過在從數據庫中獲取對應的值
11、使用union all而不是union
12、程序應有捕獲SQL異常的處理機制
13、禁止單條SQL語句同時更新多個表
14、不使用select * from
消耗cpu和IO、消耗網絡帶寬
無法使用覆蓋索引
減少表結構變更帶來的影響

七、行爲規範

1、批量導入、導出數據必須提前通知DBA協助觀察;
2、批量更新數據,如update,delete操作,需要DBA進行審查,並在執行過程中觀察服務負載等各種狀況;
3、禁止在從庫上執行後臺管理和統計類的功能查詢;
4、禁止有super權限的應用程序賬號存在;
5、產品出現非數據庫導致的故障時及時通知DBA協助排查;
6、促銷活動或上線新功能必須提前通知DBA進行流量評估;
7、數據庫數據丟失,及時聯繫DBA進行恢復;
8、對單表的多次alter操作必須合併爲一次操作,相同類型的寫操作合併爲一條語句;
9、不在MySQL數據庫中存放業務邏輯;
10、重大項目的數據庫方案選型和設計必須提前通知DBA參與;
11、對特別重要的庫表,提前與DBA溝通確定維護和備份優先級;
12、不在業務高峯期批量更新、查詢數據庫;
13、 提交線上建表需求,必須詳細註明所有相關SQL。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章