- 最上層,大多數基於網路伺服器的工具或服務都有類似架構。
- 第二層,大多數MySQL的核心服務,包括查詢解析、分析、最佳化、快取以及所有的內建函式,所有跨儲存引擎的功能都在這一層實現:儲存過程、觸發器、檢視等。
- 第三層,儲存引擎負責MySQL中資料的儲存和提取。伺服器透過API與儲存引擎通訊,這些介面遮蔽了不同儲存引擎之間的差異。
- 連線管理與安全性
每個端連線都會在伺服器程序中擁有一個執行緒,這個連線的查詢只會在這個單獨的執行緒中執行。
使用執行緒池(連線池),不需要為每個新建的連線建立或銷燬執行緒。 - 最佳化與執行
對於SELECT語句,在解析查詢之前,伺服器會先檢查查詢快取,如果能找到對應的查詢,伺服器就不必再執行查詢解析、最佳化和執行的整個過程,而是直接返回查詢快取中的結果集。
- 併發控制
無論何時,只要有多個查詢需要在同一時刻修改資料,都會產生併發控制問題。
MySQL在兩個層面進行併發控制:①伺服器層;②儲存引擎層。
-
讀寫鎖
讀鎖:共享的,多個客戶在同一時刻可以同時讀取同一資源,而互不干擾。
寫鎖:排他的,一個寫鎖會阻塞其他的寫鎖和讀鎖,確保只有一個使用者能執行寫入,並防止其他使用者讀取正在寫入的同一資源。 -
鎖粒度
一種提高共享資源併發性的方式:讓鎖定物件更有選擇性,儘量只鎖定需要修改的部分資料,而不是所有的資源。
在給定的資源上,鎖定的資料量越少,則系統的併發程度越高。
所以,鎖策略:就是在鎖的開銷和資料的安全性之間尋求平衡。
MySQL中,兩種最重要的鎖策略:
表鎖(table lock):MySQL中最基本的鎖策略,開銷 最小。鎖定整張表。
行級鎖(row lock):可以最大程度支援併發處理,同時也帶來了最大的鎖開銷。
3. 事務
事務:一組原子性的SQL查詢,事務內的語句,要麼全部執行成功,要麼全部執行失敗。
-
事務的ACID性質
a. 原子性(atomicity):一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾。
b. 一致性(consistency):資料庫總是從一個一致性的狀態轉到另外一個一致性的狀態。
c. 隔離性(isolation):一個事務所做的修改在最終提交前,對其他事務是不可見的。
d. 永續性(durability):一旦事務提交,則其所做的修改就會永久儲存到資料庫中。
一個實現了ACID的資料庫,相比沒有實現的資料庫,通常會需要更強的CPU處理能力、更大的記憶體和更多的磁碟空間。 -
事務日誌
使用事務日誌,可以提高事務的效率。
儲存引擎在修改表的資料時只需要修改其記憶體複製,再把該修改行為記錄到持久在硬碟的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。
事務日誌採用的是追加的方式,因此,寫日誌的操作是磁碟上一小塊區域內的順序I/O。
事務日誌持久後,記憶體中被修改的資料在後臺可以慢慢地刷會到磁碟。
稱為“預寫式日誌(write-ahead logging)”,修改資料需要寫兩次磁碟。
- MySQL的儲存引擎
InnoDB:MySQL的預設事務型引擎,也是最重要、使用最廣泛的儲存引擎。
MyISAM:不支援事務。