1. 程式人生 > >高效能MYSQL(mysql架構與歷史)

高效能MYSQL(mysql架構與歷史)

1. MYSQL邏輯架構
這裡寫圖片描述
第二層是mysql的核心,包括查詢解析、分析、優化、快取以及內建函式。Mysql會優化解析查詢,並建立內部資料結構(解析樹),然後對其進行各種優化,包括重寫查詢、決定表的讀取順序,以及選擇合適的索引等。
2. 併發控制
2.1 讀寫鎖
共享鎖、排它鎖,也叫讀鎖,寫鎖。
讀鎖是共享的,或者說是互不阻塞的。多個客戶在同一時刻可以同時讀取同一個資源,而 互不干擾。寫鎖是排他的,寫鎖會阻塞其他的讀鎖和寫鎖。
2.2 鎖粒度
表鎖:mysql最基本的鎖策略,並且是開銷最小的策略。鎖定整張表。
行鎖:可以最大程度支援併發處理, (帶來最大的鎖開銷)。
3. 事物


ACID:原子性、一致性、隔離性、永續性。
隔離級別:1、read uncommited(讀未提交),事物中修改即使沒有提交對其它事物也是可見的,會導致髒讀。
2. read commited(讀提交) ,一個事物開始時,只能看見已經提交的事物所做的修改。即一個事物所做的修改對其他事物是不可見的。可能導致不可重複度。
3. repeatable read(可重複讀) ,解決了髒讀的問題。保證了同一事物中讀取同一的記錄結果是一致的。沒有解決幻讀,幻讀指的是當某個事物在讀取某個範圍內的記錄時,另外一個事物又在該範圍內插入了新的記錄,之前的事物讀取該範圍的記錄就會產生幻行。
4. serializable(可序列化)最高隔離級別。強制事物序列執行,避免了前面說的幻讀問題。

4. 死鎖
死鎖是指兩個或多個事物在同一資源上互相佔用,並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。當多個事物試圖以不同的順序鎖定資源時,就可能引數死鎖。多個事物同時鎖定一個資源時,也會引數死鎖。
InnoDB目前處理死鎖的方法是,將持有最少行級排他鎖的事物進行回滾。
5. 事物日誌
事物日誌可以幫助提高事物的效率。使用事物日誌,儲存引擎在修改表的資料時只需要修改其記憶體拷貝,再把該修改行行為記錄到持久在硬碟上的事物日誌中,不需要每次豆漿修改的資料持久到磁碟。
6. MySQL中的事務
兩種事務的儲存引擎:InnoDB和NDB Cluster.
自動提交(autocommit)
Mysql預設採用自動提交模式。
設定事物的隔離級別:set transaction isolation level read commit命令設定
隱式和顯式鎖定
InnoDB採用兩階段鎖定協議。在事務執行過程中,隨時可以執行鎖定,鎖只有在執行commit或者rollback的時候才會釋放,並且所有的鎖都是同一時刻被釋放。(隱式鎖)
InnoDB也支援顯示鎖定

select ... lock in share mode
select ... for update

多版本併發控制
MVCC是行級鎖的變種,開銷較少。InnDB的mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現的。一個列是儲存行的建立時間,一個儲存行的過期時間,每一個事物開始系統版本號都會自動增加。儲存這兩個版本號,大多數事物就不用加鎖了。
7. MYSQL儲存引擎
http://blog.csdn.net/qq_23211905/article/details/72230981

1.專庫專用,資料垂直拆分
垂直拆分的意思是把不同業務的資料拆分到不同的資料庫中。影響:需要配置多個數據源,帶來的是每個資料庫連線池的隔離。需要考慮分散式事物的問題。好處是減輕資料庫的壓力。
2. 水平拆分
把同一個表中的資料拆到兩個資料庫中,引數原因:某個業務的資料表的資料量或者更新量達到單個數據庫的瓶頸。資料水平拆分和讀寫分離的區別是:讀寫分離解決的是讀壓力大的問題,對資料量大和更新量的情況並不考慮。
帶來的影響:訪問使用者資訊時需要解決SQL路由的問題,需要解決在哪個資料庫中獲取相應的資訊。主鍵機制,自增不能使用。