小螞蟻學習mysql性能優化(8)--數據庫結構優化--範式化和反範式化,水平分表,垂直分表

範式化和反範式化
數據庫

    範式化是指數據庫設計的規範,目前說到範式化通常是指第三設計範式,也就是要求數據表中不存在非關鍵字段對任意候選關鍵字段的傳遞函數依賴,則符合第三範式。數據庫設計

    呵呵,這說了個嘛玩意哈/(ㄒoㄒ)/~~,直接舉例:函數

商品名稱        價格        重量        有效期        分類        分類描述優化

可樂                3.00        250ml     2015.10    飲料        碳酸飲料spa

蘋果                5.00        100g        2015.10    水果        新鮮水果設計

分類和分類描述相對於商品名稱來講,他們是存在着依賴關係的,分類描述依賴於分類,而分類依賴於商品名稱,也就是說存在非關鍵字段「分類描述」對關鍵字段「商品名稱」的傳遞函數依賴,這就形成了不少的麻煩,好比進行增刪改操做的時候。這就須要對錶進行拆分,將分類和描述單獨列出來。hash

1.效率

商品名稱        價格        重量        有效期後臺

可樂                3.00        250ml        2015.10方法

蘋果                5.00        100g            2015.10

2.

分類            分類描述

酒水飲料        碳酸飲料

生鮮食品        水果

3.

分類            商品名稱

酒水飲料        可樂

生鮮食品        蘋果

這樣將一個表一分爲三以後就符合了第三範式要求。

反範式化

    反範式化是指爲了查詢效率的提升把本來符合第三範式的表適當的增長冗餘,以達到優化查詢效率的目的,反範式化是一種以空間換時間的操做。

    這個就不舉列子了,簡單的說,就是原本須要關聯不少表的查詢,把他們寫到一張表中,這樣只須要查一張表就能夠了,雖然增長了數據冗餘,但執行效率快了不少,說白了,少關聯一些表。

表的垂直拆分

    所謂垂直拆分,就是把原來一個不少列的表拆分紅多個表,這解決了表的寬度問題,一般垂直拆分何以按照如下原則進行:

    1.    把不經常使用的字段單獨放到一個表中

    2.    把大字段獨立存放到一個表中

    3.    把常常一塊兒使用的字段放到一塊兒

這個以前也有提到,不用多說。

表的水平拆分

    表的水平拆分主要是爲了解決單張表數據量過大的問題,水平拆分的表每個表的結構都是徹底一致的。

經常使用的水平拆分方法爲:

  1.     對customer_id進行hash運算,若是要查分紅5個表,則使用mod(customer_id,5)取出0-4個值

   2.      針對不一樣的hashID把數據存到不一樣的表中 

挑戰:1.    跨分區表進行數據查詢    2.    統計及後臺報表操做。

相關文章
相關標籤/搜索