1. 程式人生 > >?"High Performance MySQL"閱讀筆記(一)

?"High Performance MySQL"閱讀筆記(一)

mvc 安全 sql數據庫 ces 相互 3.2 RoCE 尋求 shared

在大規模水平集群的架構設計中,開源的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"閱讀筆記(一)