一. MYSQL服務(wù)器邏輯架構(gòu)
第一層負(fù)責(zé)連接管理、授權(quán)認(rèn)證彼宠、安全等等。
每個客戶端的連接都對應(yīng)著服務(wù)器上的一個線程拙已。服務(wù)器上維護了一個線程池摧冀,避免為每個連接都創(chuàng)建銷毀一個線程霉涨。當(dāng)客戶端連接到MySQL服務(wù)器時,服務(wù)器對其進行認(rèn)證楼镐。可以通過用戶名和密碼的方式進行認(rèn)證框产,也可以通過SSL證書進行認(rèn)證。登錄認(rèn)證通過后戒突,服務(wù)器還會驗證該客戶端是否有執(zhí)行某個查詢的權(quán)限描睦。
第二層負(fù)責(zé)解析查詢(編譯SQL),并對其進行優(yōu)化(如調(diào)整表的讀取順序隔崎,選擇合適的索引等)韵丑。對于SELECT語句,在解析查詢前撵彻,服務(wù)器會先檢查查詢緩存,如果能在其中找到對應(yīng)的查詢結(jié)果轴合,則無需再進行查詢解析碗短、優(yōu)化等過程,直接返回查詢結(jié)果奔坟。存儲過程搭盾、觸發(fā)器、視圖等都在這一層實現(xiàn)澜建。
第三層是存儲引擎,存儲引擎負(fù)責(zé)在MySQL中存儲數(shù)據(jù)炕舵、提取數(shù)據(jù)、開啟一個事務(wù)等等咽筋。存儲引擎通過API與上層進行通信,這些API屏蔽了不同存儲引擎之間的差異蒜危,使得這些差異對上層查詢過程透明睹耐。存儲引擎不會去解析SQL。
二. 鎖
2.1 鎖概念
共享鎖(讀鎖):讀鎖是共享的响委,互不堵塞窖梁,多個客戶可以同時讀取同一個資源,而互不干擾贝次。
排它鎖(寫鎖):寫鎖是排它的彰导,寫鎖會堵塞其他寫鎖和讀鎖,這樣確保在給定的時間里只有一個用戶能執(zhí)行寫入位谋,并防止其他用戶讀取正在寫入的同一資源。
2.2 鎖粒度
表鎖:會鎖定整張表掏父,一個用戶在對表進行插入,刪除爵政,更新時需要先獲得寫入鎖陶缺,這會堵塞其他用戶對該表的所有讀寫操作,只有在沒有寫鎖時其他讀取的用戶才能獲得讀鎖饱岸,讀鎖之間是互不堵塞的徽千。寫鎖比讀鎖具有更高的優(yōu)先級双抽,因此一個寫鎖請求可能會被插入到讀鎖隊列的前面闲礼,像alter table語句會忽略存儲引擎的鎖機制,使用innoDB在增刪改的時候是不會鎖定表的
行級鎖:行級鎖可以最大程度的支持并發(fā)的處理(同時也帶來了最大的鎖開銷)位仁,行級鎖只在存儲引擎中實現(xiàn)聂抢。
三.事務(wù)日志
事務(wù)日志可以幫助提高事務(wù)的效率棠众,使用事務(wù)日志,存儲引擎在修改表的數(shù)據(jù)時只需要修改其內(nèi)存拷貝空盼,再把該修改行為記錄到持久在硬盤上的事務(wù)日志中,而不用每次都將修改的數(shù)據(jù)本身持久到磁盤揽趾。因為事務(wù)日志采用的是追加的方式苛骨,因此寫日志的操作是磁盤上一小塊區(qū)域內(nèi)的順序I/O,而不像隨機I/O需要在磁盤的多個地方移動磁頭俐筋,所以采用事務(wù)日志的方式相對來說要快得多严衬,事務(wù)日志持久后內(nèi)存中被修改的數(shù)據(jù)在后臺可以慢慢刷會磁盤。
四.InnoDB多版本并發(fā)控制(MVCC)
通過在每行記錄后面保存兩個隱藏的列來實現(xiàn)请琳,這兩個列一個是保存了行的創(chuàng)建時間,一個保存了行的過期時間(或刪除時間)抱怔,存儲的是系統(tǒng)版本號嘀倒,每開始一個新的事務(wù)局冰,系統(tǒng)版本號都會自動遞增灌危。