高效能MySQL 第1章 MySQL架構與歷史

2021-09-11 06:00:24 字數 2163 閱讀 7823

1. 原子性(atomicity)

事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。

回滾可以用回滾日誌來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。

2. 一致性(consistency)

資料庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對乙個資料的讀取結果都是相同的。

3. 隔離性(isolation)

乙個事務所做的修改在最終提交以前,對其它事務是不可見的。

4. 永續性(durability)

一旦事務提交,則其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。

使用重做日誌來保證永續性。

1. 未提交讀(read uncommitted)

事務中的修改,即使沒有提交,對其它事務也是可見的。

2. 提交讀(read committed)

乙個事務只能讀取已經提交的事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。

3. 可重複讀(repeatable read)

保證在同乙個事務中多次讀取同樣資料的結果是一樣的。

4. 可序列化(serializable)

強制事務序列執行。在讀取的每行資料上都加鎖

隔離級別

髒讀不可重複讀

幻影讀加鎖讀

未提交讀√√

√×提交讀×√√

×可重複讀××

√×可序列化××

×√多版本併發控制(multi-version concurrency control, mvcc)是 mysql 的 innodb 儲存引擎實現隔離級別的一種具體方式,用於實現提交讀和可重複讀這兩種隔離級別。而未提交讀隔離級別總是讀取最新的資料行,無需使用 mvcc。可序列化隔離級別需要對所有讀取的行都加鎖,單純使用 mvcc 無法實現。

mvcc 在每行記錄後面都儲存著兩個隱藏的列,用來儲存兩個版本號:

實現過程:

1. select

多個事務必須讀取到同乙個資料行的快照,並且這個快照是距離現在最近的乙個有效快照。但是也有例外,如果有乙個事務正在修改該資料行,那麼它可以讀取事務本身所做的修改,而不用和其它事務的讀取結果一致。

把沒有對乙個資料行做修改的事務稱為 t,t 所要讀取的資料行快照的建立版本號必須小於 t 的版本號,因為如果大於或者等於 t 的版本號,那麼表示該資料行快照是其它事務的最新修改,因此不能去讀取它。除此之外,t 所要讀取的資料行快照的刪除版本號必須大於 t 的版本號,因為如果小於等於 t 的版本號,那麼表示該資料行快照是已經被刪除的,不應該去讀取它。

2. insert

將當前系統版本號作為資料行快照的建立版本號。

3. delete

將當前系統版本號作為資料行快照的刪除版本號。

4. update

將當前系統版本號作為更新前的資料行快照的刪除版本號,並將當前系統版本號作為更新後的資料行快照的建立版本號。可以理解為先執行 delete 後執行 insert。

next-key locks 是 mysql 的 innodb 儲存引擎的一種鎖實現。

mvcc 不能解決幻讀的問題,next-key locks 就是為了解決這個問題而存在的。在可重複讀(repeatable read)隔離級別下,使用 mvcc + next-key locks 可以解決幻讀問題。

(negative infinity, 10]

(10, 11]

(11, 13]

(13, 20]

(20, positive infinity)

事務在加鎖時有多種方式:

一次性鎖協議,事務開始時,即一次性申請所有的鎖,之後不會再申請任何鎖,如果其中某個鎖不可用,則整個申請就不成功,事務就不會執行,在事務尾端,一次性釋放所有的鎖。一次性鎖協議不會產生死鎖的問題,但事務的併發度不高。

兩階段鎖協議,整個事務分為兩個階段,前乙個階段為加鎖,後乙個階段為解鎖。在加鎖階段,事務只能加鎖,也可以運算元據,但不能解鎖,直到事務釋放第乙個鎖,就進入解鎖階段,此過程中事務只能解鎖,也可以運算元據,不能再加鎖。兩階段鎖協議使得事務具有較高的併發度,因為解鎖不必發生在事務結尾。它的不足是沒有解決死鎖的問題,因為它在加鎖階段沒有順序要求。如兩個事務分別申請了a, b鎖,接著又申請對方的鎖,此時進入死鎖狀態。

《高效能MySQL》第6章 查詢效能優化

6.2 慢查詢基礎 優化資料訪問 6.2.1 是否向資料庫請求了不需要的資料 有些查詢會請求超過實際需要的資料,然後這些多餘的資料會被應用程式丟棄。這會給mysql伺服器帶來額外的負擔,並增加網路開銷,另外也會消耗應用伺服器的cpu和記憶體資源。6.2.2 mysql是否在掃瞄額外的記錄6.3 重構...

《高效能MySQL》第6章查詢效能優化(4)

mysql通過建立並填充臨時表的方式來執行union,因此很多優化無法在union查詢中很好應用。所以需要手動將where limit order by等語句下推到union子查詢中。如果不是需要對結果去重,請使用union all。即使有all,mysql也會將結果先存於臨時表中,再讀出,這很多時...

高效能MySQL 第五章建立高效能的索引(1)

在mysql中,儲存引擎使用索引,其先在索引中找到對應值,然後根據匹配的索引記錄找到對應的資料行。索引可以包含乙個或多個列的值。一 索引的型別 在mysql中,索引是在儲存引擎層而不是伺服器層實現的。mysql支援的索引型別 b tree索引 innodb使用的是b tree。b tree通常意味著...