1. 程式人生 > >MySQL庫表基礎規範

MySQL庫表基礎規範

1. 使用Innodb儲存引擎

    5.5版本開始mysql預設儲存引擎就是InnoDB5.7版本開始,系統表都放棄MyISAM了。

2. 表字符集統一使用UTF8

    •UTF8字符集儲存漢字佔用3個位元組,儲存英文字元佔用一個位元組

    •校對字符集使用預設的 utf8_general_ci

    •連線的客戶端也使用utf8,建立連線時指定charsetSET NAMES UTF8;。(對於已經在專案中長期使用latin1的,救不了         了)

    •如果遇到EMOJ等表情符號的儲存需求,可申請使用UTF8MB4字符集

3. 所有表都要添加註釋

    •儘量給欄位也添加註釋

    •status型需指明主要值的含義,如0-離線,1-線上

4. 控制單表字段數量

    •單表字段數上限30左右,再多的話考慮垂直分表,一是冷熱資料分離,二是大欄位分離,三是常在一起做條件和返回列的不         分離。

    •表字段控制少而精,可以提高IO效率,記憶體快取更多有效資料,從而提高響應速度和併發能力,後續 alter table 也更快。

5. 所有表都必須要顯式指定主鍵

    •主鍵儘量採用自增方式,InnoDB表實際是一棵索引組織表,順序儲存可以提高存取效率,充分利用磁碟空間。還有對一些復       雜查詢可能需要自連線來優化時需要用到。

    •需要全域性唯一主鍵時,使用外部發號器ticket server(建設中)

    •如果沒有主鍵或唯一索引,update/delete是通過所有欄位來定位操作的行,相當於每行就是一次全表掃描

    •少數情況可以使用聯合唯一主鍵,需與DBA協商

6. 不強制使用外來鍵參考

    •即使2個表的欄位有明確的外來鍵參考關係,也不使用 FOREIGN KEY ,因為新紀錄會去主鍵表做校驗,影響效能。

7. 適度使用儲存過程、檢視,禁止使用觸發器、事件

    •儲存過程(procedure)雖然可以簡化業務端程式碼,在傳統企業寫複雜邏輯時可能會用到,而在網際網路企業變更是很頻                  繁 的,在分庫分表的情況下要升級一個儲存過程相當麻煩。又因為它是不記錄

log的,所以也不方便debug效能問題。如果          使 用過程,一定考慮如果執行失敗的情況。

    ·使用檢視一定程度上也是為了降低程式碼裡SQL的複雜度,但有時候為了檢視的通用性會損失效能(比如返回不必要的字               段)。

    •觸發器(trigger)也是同樣,但也不應該通過它去約束資料的強一致性,mysql只支援基於行的觸發”,也就是說,觸發器         始終是針對一條記錄的,而不是針對整個sql語句的,如果變更的資料集非常大的話,效率會很低。掩蓋一條sql背後的工             作, 一旦出現問題將是災難性的,但又很難快速分析和定位。再者需要ddl時無法使用pt-osc工具。放在transaction執 行。

    •事件(event)也是一種偷懶的表現,目前已經遇到數次由於定時任務執行失敗影響業務的情況,而且mysql無法對它做失敗       預警。建立專門的 job scheduler 平臺。

8. 單表資料量控制在5000w以內

9. 資料庫中不允許儲存明文密碼