mysql 研發規範
1. 命名
a) 有意義。
b) 數據庫、表,都用小寫,僅使用下劃線和小寫字母。
c) 索引以idx_開頭。
d) 命名不要過長,盡量少於25個字符。
e) 不要使用保留字。
f) 字段類型、命名的一致性,相同字段在不同表要相同類型、相同長度、相同命名。
g) 備份表,時間後綴。
2. 索引
a) 聯合索引,字段數量不超過5個。
b) 單表索引個數,不超過5個。
c) 唯一鍵和主鍵不要重復。
d) 創建索引時要註意字段順序。
e) order by/group by用到的字段,放到聯合索引的後面。
f) 根據explain工具,調整sql,使之合理使用索引,盡量不出現Using filesoft、Using Temporary。
g) 過長的varchar,可增加一個散列字段,為散列字段建立索引。較簡單的可使用md5。
h) 範圍條件放到復合索引的最後。
3. 表設計
a) 建議全部選擇InnoDB引擎。
b) 每個表都應有主鍵。
c) 盡量將字段設置成Not null,null值的存儲需要額外的空間,且會導致比較運算更為復雜。
d) 使用更短小的列,比如短整型,整型列的執行速度往往更快。
e) 將大字段、不頻繁使用的字段分離到另外的表,表越小,執行越快。或者將頻繁更新的表分離到其他表,因為頻繁更新會導致緩存的結果集失效,可能影響性能。註:若分離後需要經常進行表連接,就得不償失了,Mysql連接表時性能差,或者可以考慮使用程序進行連接。
f) 精確符點數,使用decimal,不要使用float/double,會不準確。
g) 整型定義,不要定義顯示長度。
h) 建議不要使用enum類型。
i) 盡可能不要使用text/blob類型。
j) varchar(n),n表示的是字符數,不是字節數,如varchar(255),存儲漢字,最多可以存255個。n應盡可能的小,進行排序和創建臨時表時,會使用n的長度申請內存,這一點在5.7後才有改進。varchar字段的最大長度為65535個字節 。
k) 字符集,選擇utf8。
l) 存儲日期,使用date;存儲時間建議使用tmestamp,timestamp是4字節,datetime是8字節。
m) 不要在數據庫中存儲文件。
4. sql語句
a) 不要select *
b) 傳參時使用占位符方式,提高性能並且防範sql註入攻擊。
c) 分割大操作。
d) in 子句包含的值不應過多,建議少於100。
e) insert 顯示指明字段名稱,批量時,每次個數不宜過多。
f) 避免在sql語句中進行數學運算或函數運算,避免將業務邏輯和數據存儲耦合。
g) 避免使用存儲過程、觸發器、函數等,這些特性會將業務邏輯與數據耦合在一起,並且mysql的這些特性可能會存在一些bug。
h) 表連接會降低性能,所以能不連就不連,能少連就少連。
i) 使用合理的SQL減少,與數據庫交互,但這一點要權衡,將一個復雜的、耗費巨大的SQL拆成多個簡單的SQL,雖然會使數據庫交互增加,但對性能是有增無減的。
5. sql腳本
去除特殊符號,如^M,文件轉為Linux格式,且使用utf8無BOM格式。
6. 數據量
a) 若優化的足好,單表達上億數據量也無問題,但這是理想情況。實際情況,單表數據量控制在5000萬以下,甚至,最好在1000萬以下。若數據量過大,則拆分成多個表,分表要使用應用層分表,最好不要使用mysql的分表特性,可能存在bug。
b) 開發某個功能之前,應對數據存儲進行估算,若數據量較大,提前考慮優化。
mysql 研發規範