高性能MySql閱讀筆記第四章--Schema與數據類型優化閱讀筆記2
Mysql schema設計
一.Mysql schema設計中的陷阱
1.當心自動生成的schema。寫的很爛的schema遷移程序,或者自動生成的schema的程序,都會導致嚴重的性能問題。
2.太多的列。Mysql的存儲引擎API工作時需要在服務器層和存儲引擎層之間通過行緩沖格式拷貝數據,然後在服務器層將緩沖內容解碼成各個列。從行緩沖中將編碼過的列轉換成行數據結構的操作代價是非常高的。
3.太多的關聯。
4.全能的枚舉。
5.變相的枚舉。
6.非此發明的NULL。之前寫了避免使用NULL的好處,並且建議盡量的考慮代替方案。但是遵循這個原則不要走極端,例如從特定類型的值域中選擇一個不可能的值(-1)代替NULL,可能導致代碼復雜很多,並且容易引入bug,處理NULL確實不容易,但有時候會比他的替代方案更好。
二.范式和反范式
對於任何給定的數據通常都有很多種表示方法,從完全的范式化到完全的反范式化,以及兩者的折中。在范式化的數據庫中,每個事實數據出現並且只出現一次。相反,在反范式的數據庫中,信息是冗余的,可能會存儲在多個地方。
1.范式的優點和缺點。
優點:
范式的更新操作通常比反范式要快。
當數據較好的范式化是,就只有很少或者沒有重復的數據,所以只需要修改更少的數據。
范式化的表通常更小,可以更好的存放在內存裡,所以執行操作會更快。
很少有多余的冗余數據意味著檢索列表數據時更少需要DISTINCT或者GROUP BY語句。
缺點:
范式schema的缺點是通常需要關聯,稍微復雜一些的查詢語句在符合范式的schema上都可能需要至少一次關聯。
2.反范式的優點和缺點。
優點:
反范式的schema因為所有數據都在一張表中,可以很好的避免關聯。
3.混用范式化和反范式化。
事實上,完全范式化和完全反范式化都是實驗室裡才有的東西。最常用的反范式化數據的方法是復制或者緩存,在不同的表中存儲相同的特定列,可以使用觸發器更新緩存值,這使得實現這樣的方案變得更簡單。
四.緩存表和匯總表
有時候提升性能最好的方法是在同一張表中保存衍生的冗余數據,有時候也需要創建一張完全獨立的匯總表或緩存表,這是非常好的方法。
五.物化視圖。
物化視圖實際上是預先計算並且存儲在磁盤上的表,可以通過各種各樣的策略刷新和更新。
六.計數器表。預制行。
七.加快ALTER TABLE操作的速度。通過MODIFY COLUMN,ALTER COLUMN操作來改變列的默認值。
八.只修改.frm文件。
下面這些操作可能不需要重建表。
1.移除一個列的 AUTO_INCREMENT屬性。
2.增加,移除或更改ENUM和SET常量,如果移除的是已經有行數據用到的常量,查詢將會返回一個空字符串。
總結:
良好的schema設計原則是普遍適用的,但Mysql有他自己的實現細節要注意,概括起來說,盡可能保持任何東西小而簡單總是最好的。