標籤:
1.1、mysql的邏輯架構
架構為如下:
儲存引擎:負責資料的儲存和提取,供了幾十個API供服務層進行調用。各個儲存引擎之間不會進行互動,只是供服務層進行調用。事務控制和鎖的管理也是在儲存引擎裡面進行。
服務層:一個sql過來之後,會在服務層進行解析,建立解析樹,調用底層的儲存引擎得到各種開銷資訊和統計資訊,進行各種最佳化,決定表的讀取順序以及選擇合適的索引。
1.2 並發控制
1、 mysql通過加讀鎖和寫鎖來進行並發控制。
2、鎖的粒度
表鎖 並發程度低,鎖的開銷小 alter table 會加表鎖
行級鎖 並發程度高,但是鎖的開銷大
3、鎖的控制是在儲存引擎裡面實現的,所以不同的儲存引擎加鎖的順序是不一樣的,有的能引起死結有的則不會。
1.3事務 事務的ACID屬性
原子性:一個事務的操作要麼全部執行成功,要麼全部失敗復原。
一致性:在執行事務的第3,4條語句的時候資料庫崩潰了,資料還是一致的。
隔離性:一個事務的操作對另一個事務的可見度。Mysql預設為可重複讀。
持久性:一旦事務提交,其所做的修改就會永久的同步到資料庫中。
1.3.1隔離等級
read uncommited(讀未提交) 造成髒讀
read commited(提交讀) 造成不可重複讀取
oracle和sql server預設是這種層級
repeatable read(可重複讀) 造成幻讀
mysql預設是此層級(通過MVCC和鎖機制)
mysql通過mvcc和間隙鎖解決了幻讀的問題
seriable(可序列化)
事務是串列執行的
1.3.2死結
因為請求資源的方式不一致可能導致死結
資料庫系統實現死結檢測,解除死結,和請求鎖逾時等機制。
如果死結發生,會將含有最少行級鎖的事務進行復原來解除死結。
1.3.3 交易記錄
因為更新資料到磁碟上資料分布的不均勻,所以花費的時間比較長。但是可以將操作以日誌的形式添加到記錄檔末尾,日誌的儲存操作是有序的。這能加快速度。
1.3.4mysql的事務
1、預設每個串連都是AutoCommit,可以在建立串連之後通過命令 show variables like ‘AUTOCOMMIT‘來查看當前的狀態。
可以通過 set AUTOCOMMIT=0來設定事務不是自動認可的。那麼所有查詢都是在一個事務裡,直到顯式的進行提交或者進行復原。
2、一些操作會自動認可當前的事務,如alter table,lock tables
3、設定事務的隔離等級(可以設定全域的和會話層級的)
可以通過set transaction isolation level來設定全域的交易隔離等級
可以通過set session transaction isolation level 設定本連結的隔離等級,並在下次事務中生效。
1.3.5混合使用儲存引擎
1、不推薦這樣使用
2、如果一個事務同時操作支援事務的儲存引擎表和不支援事務的儲存引擎表,如果事務成功提交則沒什麼問題。如果交易回復,則支援事務的儲存引擎表能復原,但是不支援事務的儲存引擎表不能復原,會造成資料一致性問題。
MySql的架構和曆史