MySQL資料庫優化——資料庫表的正規化化優化
阿新 • • 發佈:2019-01-12
1、表正規化化
正規化化是指資料庫設計的規範,目前說道範式化一般是指第三設計正規化。也就是要求資料表中不存在非關鍵欄位對任意候選關鍵欄位的傳遞函式依賴則符合第三正規化。
存在以下傳遞函式依賴關係:
(商品名稱)->(分類)->(分類描述)
也就是說存在非關鍵欄位 “分類描述”對關鍵欄位“商品名稱”的傳遞函式依賴。
不符合第三正規化要求的表存在以下問題:
- 資料冗餘:(分類,分類描述)對於每一個商品都會進行記錄。
- 資料的插入異常
- 資料的更新異常
- 資料的刪除異常(刪除所有資料,分類和分類描述都會刪除,沒有所有的記錄)
如何轉換成符合第三正規化的表(拆分表):
將原來的不符合第三正規化的表拆分為3個表
商品表、分類表、分類和商品的關係表
2、反正規化化
反正規化化是指為了查詢效率的考慮把原本符合第三正規化的表“適當”的增加冗餘,以達到優化查詢效率的目的,反正規化化是一種以空間來換取時間的操作。
如何查詢訂單資訊?
select b.使用者名稱,b.電話,b.地址,a.訂單ID,sum(c.商品價格*c.商品數量)as 訂單價格 from 訂單表 as a join 使用者表 as b on a.使用者ID=b.訂單ID join 訂單商品表 as c on c.訂單ID=b.訂單ID group by b.使用者名稱,b.電話,b.地址,a.訂單ID |
對於這樣的表結構,對於sum(),group by會產生臨時表,增加IO量。我們怎麼優化都效率不高,那我們怎麼樣才能讓它效率高了,就需要一些欄位進行冗餘。
訂單表中增加了冗餘欄位,那SQL該怎麼寫了?
select a.使用者名稱,a.電話,a.地址,a.訂單ID,a.訂單價格 from 訂單表 as a |
說明:表結構的設計直接涉及到SQL的查詢效率及優化。