?"High Performance MySQL"閱讀筆記(一)
在大規模水平集群的架構設計中,開源的MySQL受到的關註度越來越高。
到2012年整個淘寶網的核心交易系統已經全部運行在基於PC服務器的MySQL數據庫集群中。
一、MySQL架構與歷史
MySQL最重要、最與眾不同的特性是它的存儲引擎架構,這種架構的設計將查詢處理(Query Processing)及其他系統任務(Server Task)和數據的存儲/提取相分離。
這種處理和存儲相分離的設計可以在使用時根據性能、特性,以及其他需求來選擇數據存儲方式。
1.1 MySQL邏輯架構
照著書上畫的邏輯架構圖
最上層的客戶端;
第二層包含大多數MySQL核心服務功能,包括查詢解析、分析、優化、緩存以及所有的內置函數。所有跨存儲引擎的功能都在這一層實現:存儲過程、觸發器、視圖等;
第三層包含了存儲引擎。存儲引擎不會去解析SQL,不同存儲引擎之間也不會相互通信。(InnoDB會解析外鍵定義,這是一個例外)
1.1.1 連接管理與安全性
每個客戶端連接都會在服務器進程中擁有一個線程。服務器會緩存線程,因此不需要為每個新建的連接創建或者銷毀線程。
1.1.2 優化與執行
MySQL會解析查詢,並創建內部數據結構(解析樹),然後對其進行各種優化,包括重寫查詢、決定表的讀取順序,以及選擇合適的索引等。用戶可以通過特殊的關鍵字提示(hint)優化器,影響它的決策過程。也可以請求優化器解釋(explain)優化過程的各個因素,使用戶可以知道服務器是如何進行優化決策的,並提供一個參考基準,便於用戶重構查詢和schema、修改相關配置,使應用盡可能高效運行。
對於SELECT語句,在解析查詢前,服務器會先檢查查詢緩存(Query Cache),如果能夠在其中找到對應的查詢,服務器就不必再執行查詢解析、優化和執行的整個過程,而是直接返回查詢緩存中的結果集。(詳見第7章)
1.2 並發控制
1.2.1 讀寫鎖
共享鎖(shared lock) 和排他鎖(exclusive lock),也叫讀鎖和寫鎖。
1.2.2 鎖粒度
由於加鎖也要消耗資源,所以理想方式是精確的鎖定。
所謂鎖策略,就是在鎖的開銷和數據的安全性之間尋求平衡。
MySQL支持多個存儲引擎的架構,每種MySQL存儲引擎都可以實現自己的鎖策略和鎖粒度。
兩種重要的鎖策略:表鎖(table lock)和行級鎖(row lock)
服務器會為諸如ALTER TABLE之類的語句使用表鎖,而忽略存儲引擎的鎖機制。
InnoDB和XtraDB,以及其它一些存儲引擎中實現了行級鎖(行級鎖只在存儲引擎層實現,服務器層沒有實現)。
1.3 事務
事務就是一組原子性的SQL查詢,或者說一個獨立的工作單元。
START TRANSACTION
...
COMMIT;
事務的特性ACID(atomicity,consistency,isolation,durability)
1.3.1 隔離級別
ANSI SQL隔離級別
未提交讀,事務可以讀取未提交的數據,被稱為臟讀。
提交讀,大多數數據庫系統的默認隔離級別。有時也叫做不可重復讀,因為兩次執行相同的查詢,可能會得到不一樣的結果。
可重復讀,理論上無法解決幻讀(Phantom Read)。所謂幻讀,指某個事務在讀取某個範圍的記錄時,另一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍內的記錄時,會產生幻行。
InnoDB和XtraDB存儲引擎通過多版本並發控制(MVCC)解決了幻讀,可重復讀是MysSQL默認隔離級別。
可串行化,強制事務串行執行。
1.3.2 死鎖
死鎖是指兩個或多個事務在同一資源上相互占用,並請求對方占用的資源,從而導致惡性循環的現象。
InnoDB目前處理死鎖的方式是,將持有最少行級排他鎖的事務進行回滾(這是相對比較簡單的死鎖回滾算法)。
以同樣的順序執行語句,有些存儲引擎會產生死鎖,有些則不會。
1.3.3 事務日誌
1.3.4 MySQL中的事務
MySQL提供了兩種支持事務的存儲引擎:InnoDB和NDB Cluster.
InnnoDB采用的是兩階段鎖定協議。
MySQL也支持LOCK TABLES 和UNLOCK TABLES,這是在服務器層實現的。
?"High Performance MySQL"閱讀筆記(一)