MySQL總結(一) 儲存引擎及各種鎖

2021-09-26 03:32:42 字數 2941 閱讀 9072

儲存引擎在mysql的邏輯架構中位於第三層,負責mysql中的資料的儲存和提取。myisam是mysql的預設資料庫引擎(5.5版之前)。雖然效能極佳,而且提供了大量的特性,包括全文索引、壓縮、空間函式等,但myisam不支援事務和行級鎖,而且最大的缺陷就是崩潰後無法安全恢復。不過,5.5版本之後,mysql引入了innodb(事務性資料庫引擎),mysql 5.5版本後預設的儲存引擎為innodb。

innodb和myisam區別

是否支援行級鎖: myisam 只有表級鎖(table-level locking),而innodb 支援行級鎖(row-level locking)和表級鎖,預設為行級鎖。

是否支援事務和崩潰後的安全恢復: myisam 強調的是效能,每次查詢具有原子性,其執行數度比innodb型別更快,但是不提供事務支援。但是innodb 提供事務支援事務,外部鍵等高階資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (acid compliant))型表。

是否支援外來鍵: myisam不支援,而innodb支援。

是否支援mvcc:僅 innodb 支援。應對高併發事務, mvcc比單純的加鎖更高效;mvcc只在 read committed 和 repeatable read 兩個隔離級別下工作;mvcc可以使用 樂觀(optimistic)鎖 和 悲觀(pessimistic)鎖來實現;各資料庫中mvcc實現並不統一。

行級鎖是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖 和 排他鎖。

開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。行級鎖適用於高併發環境下,對事務完整性要求較高的系統

表級鎖是mysql中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,被大部分mysql引擎支援。最常使用的myisam與innodb都支援表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨佔寫鎖(排他鎖)。

開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發出鎖衝突的概率最高,併發度最低。

表級鎖使用與併發性不高,以查詢為主,少量更新的應用

頁級鎖是mysql中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但衝突多,行級衝突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。

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

相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。

myisam和memory儲存引擎採用的是表級鎖(table-level locking);

innodb儲存引擎既支援行級鎖( row-level locking),也支援表級鎖,但預設情況下是採用行級鎖。

myisam鎖

myisam儲存引擎主要是表級鎖,它有兩種模式:

表共享讀鎖(table read lock)和表獨佔寫鎖(table write lock)。

當myisam在執行查詢語句時,會自動給涉及到表加讀鎖,在執行更新操作時,會加寫鎖。當然使用者也可以用lock table 去顯式的加鎖。

需要在乙個時間點實現多個表的一致性讀取,不然的話,可能讀第乙個表時,其他表由於還沒進行讀操作,沒有自動加鎖,可能資料會發生改變。並且顯示加鎖後只能訪問加鎖的表,不能訪問其他表。

myisam儲存引擎有個系統變數 concurrent_insert,專門用來控制併發插入的行為,可以取 0 , 1 , 2。

0表示不允許併發插入,1表示表中間沒有刪除的行時可以在表末尾插入,2表示總是可以插入。

注意:

讀操作不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求;

並且當寫鎖和讀鎖同時被申請時,優先獲得寫鎖,這也這正是表級鎖發生鎖衝突概率最高的原因,因為寫鎖可能會一直阻塞讀鎖

雖然寫鎖優先於讀鎖獲取,但是長時間的查詢操作也可能會讓寫操作餓死,所以盡量避免一條sql語句執行所有的查詢,應該進行必要的分解。

innodb鎖

由於innodb支援事務,並預設是使用行級鎖。

共享鎖(s)和排他鎖(x),分別類似於myisam的讀鎖和寫鎖。對於 update、 delete 和 insert 語句,innodb會自動給涉及資料集加排他鎖(x);對於普通 select 語句,innodb不會加任何鎖。

可以顯式的加鎖,用lock in share mode 顯式的加共享鎖,用 for update 顯式的加排他鎖。

如果執行緒a加了共享鎖後,執行緒b對同乙個表加了共享鎖,那麼兩個執行緒需要進行更新操作時會產生死鎖。所以,進行更新操作時最好加排他鎖。

innodb行鎖的實現方式——索引加鎖

(1)、只有通過索引條件檢索資料時,innodb才會使用行級鎖,否則會使用表級鎖。

(2)、即使是訪問不同行的記錄,如果使用的是相同的索引鍵,會發生鎖衝突。

(3)、如果資料表建有多個索引時,可以通過不同的索引鎖定不同的行。

資料庫中死鎖

myisam是沒有死鎖問題的,因為他會一次性獲得所有的鎖。

innodb發生死鎖後一般能自動檢測到,並使乙個事務釋放鎖並回退,另乙個事務獲得鎖,繼續完成事務。

避免死鎖方式

(1) 如果不同的程式會併發的訪問多個表,應盡量約定以相同的順序來訪問表,這樣可以大大降低產生死鎖的機會。

(2) 在程式以批量方式處理資料時,如果事先對資料排序,保證每個執行緒按固定的順序來處理記錄,也可以大大的降低出現死鎖的可能。

MySql各種引擎總結

mysql由於輕量級,倍受大家歡迎,因此在這裡先分享一下其中的各種儲存引擎。isam 在mysql5.1以上的版本已經不支援 該引擎讀取速度非常快並且不佔什麼記憶體,但有個明顯的弊端,不支援外來鍵約束 無法容錯 不支援索引。innodb儲存引擎 innodb是事務型資料庫的首選引擎,支援事務安全表 ...

mysql引擎總結 MySQL儲存引擎總結

儲存引擎 儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。儲存引擎的選擇 1 是否需要支援事務 2 是否需要使用熱備 3 崩潰恢復 能否接受崩潰 4 是否需要外來鍵支援 myisam 1 每當建立乙個myisam引擎的表時,就會在本地磁碟上建立三個檔...

MySQL儲存引擎總結

儲存引擎 儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。儲存引擎的選擇 1 是否需要支援事務 2 是否需要使用熱備 3 崩潰恢復 能否接受崩潰 4 是否需要外來鍵支援 myisam 1 每當建立乙個myisam引擎的表時,就會在本地磁碟上建立三個檔...