mysql調優之schema優化
阿新 • • 發佈:2022-05-08
1. 合理使用正規化和反正規化
MySQL的三正規化:
1NF(第一正規化):欄位不可分;
2NF(第二正規化):有主鍵,非主鍵欄位依賴主鍵;
3NF(第三正規化):非主鍵欄位不能相互依賴;
解釋:
1NF:原子性 欄位不可再分,否則就不是關係資料庫;
2NF:唯一性 一個表只說明一個事物;
3NF:每列都與主鍵有直接關係,不存在傳遞依賴;
在企業中很難能做到嚴格意義上的正規化或者反正規化,一般需要混合使用
正規化設計和反正規化設計的案例:
訂單表如果完全按照正規化設計,查詢訂單對應的使用者資訊時,會用到很多聯合查詢;如果用反正規化設計,會明顯提高查詢效率。
2. 主鍵的選擇
代理主鍵:與業務無關的,無意義的數字序列,比如:id
自然主鍵:事物屬性中的自然唯一標識,比如:身份證號
推薦使用代理主鍵:
- 它們不與業務耦合,因此更容易維護
- 一個大多數表,最好是全部表,通用的鍵策略能夠減少需要編寫的原始碼數量,減少系統的總體擁有成本
3. 字符集的選擇
- 純拉丁字元能表示的內容,沒必要選擇 latin1 之外的其他字元編碼,因為這會節省大量的儲存空間。mysql預設是latin1。
- 如果我們可以確定不需要存放多種語言,就沒必要非得使用UTF8或者其他UNICODE字元型別,這回造成大量的儲存空間浪費。
- MySQL的資料型別可以精確到欄位,所以當我們需要大型資料庫中存放多位元組資料的時候,可以通過對不同表不同欄位使用不同的資料型別來較大程度減小資料儲存量,進而降低 IO 操作次數並提高快取命中率。
- 如果不儲存中文,用latin1就足夠了;如果要儲存中文,就用utf8mb4。utf8mb4是一種最常用的方式。
4. 儲存引擎的選擇
mysql預設儲存引擎是InnoDB
5. 適當的資料冗餘
- 被頻繁引用且只能通過 Join 2張(或者更多)大表的方式才能得到的獨立欄位。
- 這樣的場景由於每次Join僅僅只是為了取得某個小欄位的值,Join到的記錄又大,會造成大量不必要的 IO,完全可以通過空間換取時間的方式來優化。不過,冗餘的同時需要確保資料的一致性不會遭到破壞,確保更新的同時冗餘欄位也被更新。
6. 適當拆分
當我們的表中存在類似於 TEXT 或者是很大的 VARCHAR型別的大欄位的時候,如果我們大部分訪問這張表的時候都不需要這個欄位,我們就該義無反顧的將其拆分到另外的獨立表中,以減少常用資料所佔用的儲存空間。這樣做的一個明顯好處就是每個資料塊中可以儲存的資料條數可以大大增加,既減少物理 IO 次數,也能大大提高記憶體中的快取命中率。