總結之MySQL數據庫結構優化

MySQL插件式存儲引擎架構

在這裏插入圖片描述

MySQL兩種常用存儲引擎分析

MyISAM

MySQL5.5之前版本默認存儲引擎
其中系統表、臨時表(在排序、分組等操作中,當數量超過一定的大小之後,由查詢優化器建立的臨時表)使用MyISAM
特性:表級鎖、併發性不行、可以表損壞修復、支持全文索引、支持數據壓縮
限制:版本<MySQL5.0時默認表大小爲4G,版本>MySQL5.0是默認表大小>256TB
適用場景:
非事務型應用、只讀類應用、空間類應用

Innodb

MySQL5.5之後版本默認存儲引擎
Innodb使用表空間進行 數據存儲
在這裏插入圖片描述
比較:
系統表空間無法簡單的收縮文件大小
系統表空間會產生IO瓶頸
獨立表空間可以通過oprimize table命令收縮系統文件
獨立表空間可以同時向多個文件刷新數據
建議:獨立表空間(5.6後系統默認)

在這裏插入圖片描述
Innodb特性:是一種事務性存儲引擎、完全支持事務的ACID特性、使用Redo Log存儲已提交事務和Undo Log存儲爲提交事務
Innodb支持行級鎖
行級鎖可以最大程度的支持併發
行級鎖是由存儲引擎層實現的

補充:什麼是鎖

鎖對主要作用是管理共享資源的併發訪問
鎖用於實現事務的隔離性(Redo Log和Undo Log實現了事務的原子性、一直性、持久性)
鎖的類型
共享鎖(也稱讀鎖)
獨佔鎖(也稱寫鎖)在這裏插入圖片描述
鎖的粒度
表級鎖
行級鎖
阻塞和死鎖
什麼是阻塞
阻塞很正常,資源被排他鎖阻塞
死鎖是兩個線程相互佔用資源
mysql系統會自動處理阻塞和死鎖
Innodb適合於大多數OLTP應用

數據庫結構優化的目的

  • 減少數據冗餘
  • 儘量避免數據維護中出現更新,插入和刪除異常

插入異常:如果表中的某個實體隨着另一個實體而存在。
更新異常:如果更改表中的某個實體的單獨屬性時,需要對多行進行更新。
刪除異常:如果刪除表中的某一實例則會導致其他實例的消失。

  • 節約數據存儲空間

數據庫結構設計的步驟

需求分析:全面瞭解產品設計的存儲需求
存儲需求、數據處理需求、數據的安全性和完整性
邏輯設計:設計數據的邏輯存儲結構
數據實體之間的邏輯關係、j解決數據冗餘和數據維護異常
物理設計:根據所使用的數據庫特點進行表結構設計
維護優化:根據實際情況對索引、存儲結構等進行優化

數據庫設計範式

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

反範式化設計

在開發中會常見,反範式化就是未了性能和讀取效率的考慮而適當的對數據庫設計範式的要求進行違法,而允許存在少量的數據冗餘,換句話來說反範式就是使用空間來換取時間。

範式化優點

可以儘量的減少數據冗餘
範式化的更新操作比反範式化更快
範式化的表通常比反範式化更小

範式化缺點

對於查詢需要對多個表進行關聯
使難進行索引優化

反範式化優點

可以減少表的關聯
可以更好的進行索引優化

反範式化缺點

存在數據冗餘及數據維護異常
對數據的修改需要更多的成本

物理設計

數據庫、表及字段命名規範
可讀性原則、表意性原則。

存儲引擎

在這裏插入圖片描述

爲表中的字段選擇合適的數據類型

當一個列可以選擇多個數據類型時,應該優先考慮數字類型,其次是日期或二進制類型,最後是字符類型。對於相同級別數據類型,應該優先選擇佔用空間小的數據類型。
1、數字類型在排序等操作中比字符快
2、數據小使用的數據頁也小

如何選擇整數類型

在這裏插入圖片描述

如何選擇實數類型

在這裏插入圖片描述
DECIMAL(18,9) 需要9個字節來存儲
如果是財務的數據就需要DECIMAL類型,因爲他們相關不會偏移,不會,1+1=2.0000000000001

如何選擇VARCHER和CHAR類型

在這裏插入圖片描述
在這裏插入圖片描述
使用建議:1、使用最小的符合需求的長度
2、varchar(5)和varchar(200)存儲‘MySQL’字符串性能不同
3、varchar經常改變大小會容易頁分裂
在這裏插入圖片描述
在這裏插入圖片描述

如何存儲日期類型

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

主要事項:

1、
在這裏插入圖片描述
2、使用Int存儲日期時間不如使用timestample類型

如何爲Innodb 選擇主鍵

主鍵應該儘可能的小
主鍵應該是順序增長的
Innodb的主鍵和業務主鍵可以不同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章