MySql歷史與架構
MySQL 邏輯架構
連接管理與安全性
每個客戶端連接都會有一個線程
認證基於用戶名,原始主機信息和密碼
優化與執行
Mysql會解析查詢並進行優化
對於select會先檢查查詢緩存,能夠找到就直接返回結果集
並發控制
讀寫鎖
鎖在COMMIT或ROLLBACK時自動釋放
讀鎖(共享鎖)
共享,不阻塞,多個用戶可以同時讀同一個資源
寫鎖(獨佔鎖)
保證只有一個用戶寫入,防止其他用戶寫入或讀取數據
鎖粒度
加鎖,鎖的檢查,鎖的解除都是要消耗系統資源的
加鎖的對象大小成為鎖粒度
鎖策略
在鎖的開銷與數據的安全性中尋求平衡
行鎖
最大程度支持並發,MySQL服務器層沒有實現,由存儲引擎實現
表鎖
開銷最小
MySQL服務器可以根據自己的目的加上表鎖而忽略存儲引擎的鎖機制
事務
一組原子性的SQL語句,要麼全部執行,要麼全部不執行
ACID
-
原子性: 要麼全部執行,要麼全部不執行
-
一致性: 狀態的改變是完全的,不存在改變一半就被保存的情況
-
隔離性: 在提交前對其他事務不可見
-
持久性: 數據更改會永遠保存
隔離級別
未提交讀(Read Uncommited)
即使事務未曾提交,數據對於其他事務也是可見的.即事務可以讀取未提交的數據,也叫臟讀或讀臟數據
可提交讀
即一個事務在提交之前,改變對其他事務是不可見的,又叫不可重複讀,幻讀(在一個事務讀取數據後還未提交時,另一個事務更改了數據)
可重複讀
解決了幻讀和臟讀的問題
可串行化
強制事務串行執行,給每一行數據加鎖
死鎖
死鎖指兩個或多個事務在同一個資源上相互佔用,並請求鎖定對方佔用的資源,從而造成的惡性循環
死鎖發生後,只能通過部分或完全回滾事務才能解決
例子
事務日誌
好處
-
避免頻繁從內存向磁盤中寫入數據(可以記錄下日誌操作,在後台慢慢一次寫入,所以日誌文件是追加寫)
-
便於出現故障後的恢復
Mysql中的事務
自動提交(AUTOCOMMIT)
混合使用多種存儲引擎
InnoDB: 支持事務
MyISAM: 不支持事務
不支持事務的表回滾不能撤銷更改
隱式和顯式鎖定
顯式: 自動加鎖
隱式: 主動加鎖
多版本並發控制(MVCC)
-
一個列保存了創建時間,一個列保存刪除時間(時間指版本號)
-
每開始一個新的事務,系統版本號都會遞增,並把事務開始時的版本號作為事務的版本號,供與查詢到的每行版本號相匹配
MySql存儲引擎
-
表的定義存儲在.frm文件中
-
通過show table status ‘tableName’查看錶的相關定義信息
InnoDB
是MySql的默認事務型引擎,也是使用最廣泛的存儲引擎,被設計用來處理大量短期事務
-
數據存儲在表空間中
-
採用MVCC實現並發,實現四種隔離級別,默認可重複讀
-
基於聚簇索引(第二索引必須包含主鍵)建立
MyISAM
缺點
-
不支持事務和行級鎖
-
數據庫崩潰後無法安全恢復
特性
-
對整張表加鎖,而不是針對行,但在讀取數據的時候依然可以插入新的數據(並發插入)
-
延遲更新索引鍵
其他引擎
CSV
用於轉化.csv文件成數據庫里的表
Memory
Archive
第三方引擎
選擇合適的引擎
除非用到某些InnoDB不具備的特性,並且沒有其他辦法可以替代,否則都應該優先選擇InnoDB引擎
最好不要混用多種存儲引擎!!!
更換表的引擎
ALTER TABLE
ALTER Table name Engine = InnoDB
