關於《高效能MySQL》的一些簡單分享by笑臉岑

2021-07-10 18:10:59 字數 2618 閱讀 3030

在這裡主要想簡單分享一些關於併發相關的內容,主要內容如下:

併發控制目的是當多個連線對資料庫進行修改時保證資料的一致性。mysql提供兩個級別的併發控制:伺服器級和儲存引擎級。

從功能上可以分為共享鎖和排他鎖,也就是我們常講的讀鎖和寫鎖。簡單描述就是:讀鎖是共享的,

或者說是互相不阻塞的。多個使用者在同一時刻可以同時讀取統一資源,而互不干擾。寫鎖則是排他的,

也就是說乙個寫鎖會阻塞其他的寫鎖和讀鎖。

從粒度上分類:

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。一般ddl使用。表鎖分為表共享讀鎖(共享鎖)和表獨佔寫鎖(排他鎖)。

表共享讀鎖用法

lock table ... read;

表獨佔寫鎖用法

lock table...  write;

解鎖表用法

unlock tables;

行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。行級鎖分為共享鎖和排他鎖。

行共享鎖用法

select ... lock in share mode;

行排他鎖用法

select ... for update;

具體鎖定哪行,後面加where條件即可。

我們現在資料庫表都用的innodb,innodb支援行級鎖,如果換成myisam就不支援行級鎖。

頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。

併發事務帶來的問題

隔離級別

髒讀(dirty read)

不可重複讀(nonrepeatable read)

幻讀(phantom read)

未提交讀(read uncommitted)

可能可能

可能已提交讀(read committed)

不可能可能

可能可重複讀(repeatable read)

不可能不可能

可能可序列化(serializable )

不可能不可能

不可能

資料庫實現事務隔離的方式, 基本上可以分為兩種方式:

資料庫的事務隔離越嚴格,併發***越小,但付出的代價也就越大,因為事務隔離實質上就是使事務在一定程度上「序列化」進行.

第一點:

mvcc並不是mysql獨有的,oracle,postgresql等都在使用。

mvcc並沒有簡單地使用行鎖,而是使用「行級別鎖」(row-level locking)。

mvcc的基本原理是:

mvcc的實現,通過儲存資料在某個時間點的快照來實現的。這意味著乙個事務無論執行多長時間,在同乙個事務裡能夠看到資料一致的檢視。根據事務開始的時間不同,同時也意味著在同乙個時刻不同事務看到的相同表裡的資料可能是不同的。

mvcc的基本特徵:

innodb儲存引擎mvcc的實現策略:

innodb mvcc提供了兩個關鍵功能,一:寫不阻塞讀 。  二:讀一致性

在每一行資料中額外儲存兩個隱藏的列:當前行建立時的版本號和刪除時的版本號(可能為空)。這裡的版本號並不是實際的時間值,而是系統版本號(innodb engine 有乙個全域性的 transaction id)。每開始乙個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢每行記錄的版本號進行比較。

每個事務又有自己的版本號,這樣事務內執行crud操作時,就通過版本號的比較來達到資料版本控制的目的。具體做法見下面的示意圖。

mvcc具體的操作如下:

select:innodb會根據以下兩個條件檢查每行記錄:

1)innodb只查詢版本早於當前事務版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,只麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的。

2)行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。

insert:innodb為新插入的每一行儲存當前系統版本號作為行版本號。

delete:innodb為刪除的每一行儲存當前系統版本號作為行刪除標識。

update:innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當系統的版本號為原來的行作為刪除標識。

儲存這兩個額外系統版本號,使大多數操作都可以不用加鎖。這樣設計使得計資料操作很簡單,效能很好,並且也能保證只會讀取到符合標準的行。不足之處是每行記錄都需要額外的儲存空間,需要做更多的行檢查工作,以及一些額外的維護工作。

mvcc只在repeatable read和read commited兩個隔離級別下工作,其它兩個隔離級別和mvcc不相容。

鎖的策略

併發性開銷引擎表

最低最低

myisam,merge,memory行高

高ndb cluster

行和mvcc

最高最高

innodb,falcon,pbxt,solidd

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

mysql效能測試 MySQL的一些效能測試

針對資料庫引擎 myisam和innodb.做了一些效能測試和比較。包括有沒有索引的情況下的比較。主要是想證實一些效能問題。資料量 6 millions,機器 dell 2950 1.alter from innodb to myisam no index has two indexes 1min3...

mysql高效能學習(一)

最上層的服務不是,mysql所獨有的,主要用於連線處理,授權認證,安全等。第二層是mysql的核心層,所有核心功能都在這一層,包括查詢解析,分析,優化,快取 以及所有的內建函式,所有跨儲存引擎功能 都在這 一層實現 儲存過程,觸發器,檢視等。第三層包含了儲存引擎,負責mysql中資料的儲存和提取。1...