mysql常用儲存引擎以及悲觀鎖與樂觀鎖

2021-09-03 01:50:47 字數 3279 閱讀 8949

一.mysql常用儲存引擎

(1)myisam儲存引擎:

不支援事務,也不支援外來鍵,優勢是訪問速度快,對事務完整性沒有要求或者以選擇,插入的為主應用基本上可以用這個引擎來建立

³³表可以配合鎖,實現作業系統下的複製備份,遷移。 

使用表級鎖,併發性差。 

支援全文檢索(mysql inonodb在5.6以後也支援全文

檢索)。主機宕機後,myisam表易損壞,災難恢復性不佳。 

無事務支援。 

只快取索引,資料的快取是利用作業系統緩衝區來實現的

。資料緊湊儲存,因此可獲得更小的索引和更快的全表掃瞄效能。 

(2)innodb儲存引擎(從mysql 5.5版本開始,innodb是mysql預設的儲存引擎。)

支援事務,災難恢復性好;支援外來鍵.;支援熱備份 

支援事務,預設的事務隔離級別是可重複讀,其事務控制是通過多版本併發控制來實現的。 

使用行級鎖 

對於innodb引擎中的表,其資料的物理組織形式是簇表(cluster table),資料按主鍵來組織,也就是說主鍵索引資料表的另一種常見形式是非簇表

,其索引是有序的,而資料是無序的。 

實現了緩衝管理,不僅能緩衝索引也能緩衝資料,並且會自動建立雜湊索引以加快資料

的獲取。相比之下,myisam資料只是快取了索引。 

(3)儲存器儲存引擎

儲存器儲存引擎使用存在於記憶體中的內容來建立表

。每個儲存器表只實際對應乙個磁碟檔案

,格式是.frm.memory型別的表訪問非常的快,因為它的資料是放在記憶體中的

,並且預設使用hash索引,但是一旦服務關閉,表中的資料就會丟失掉。記憶體 

儲存引擎的表可以選擇使用btree索引或者hash索引,兩種不同型別的索引有其不同的使用範圍

hash索引優點: 

hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b-tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以雜湊索引的查詢效率要遠高於b樹索引。 

雜湊索引缺點:那麼不精確查詢呢,也很明顯,因為雜湊演算法是基於等值計算的,所以對於「喜歡」等範圍查詢雜湊索引無效,不支援;

memory儲存引擎提供「記憶體」表,也不支援事務,外來鍵。 

使用記憶體表(記憶體引擎)可以顯著提高訪問資料的速度,可用於快取會頻繁訪問的,可以重構的資料,計算結果,統計值,中間結果,但也有如下這些不足之處。 

使用的是表級鎖,雖然記憶體訪問快,但如果頻繁地讀讀,表級鎖可能會成為瓶頸所在。

只支援固定大小的行.varchar型別的字段會儲存為固定長度的char型別,

浪費空間。不支援text,blob欄位。當有些查詢需要使用到臨時表(使用的也是memory儲存引擎)時如果表中有text,blob欄位,那麼會轉化為基於磁碟的myisam表,嚴重降低效能。 

由於記憶體資源成本昂貴,一般不建議設定過大的記憶體表,如果記憶體表滿了,就會在mysql錯誤日誌裡發現類似「thetable'table_name'已滿「這樣的錯誤,可通過清除資料或調整記憶體表引數來避免報錯。 

服器重啟資料會丟失

(4)merge引擎儲存

合併儲存引擎的英文一組的myisam的表的組合,這些的myisam的表必須結構完全相同,合併表本身並沒有資料,對合併型別的表可以進行查詢,更新,刪除操作,這些操作實際上是對內部的的myisam資料表進行的。

(5)archive引擎 

儲存引擎的英文被設計用來儲存企業中的大量流水資料儲存引擎。存檔引擎使用的zlib無損資料壓縮,讓資料都儲存在壓縮的儲存表中

。當資料被插入時,它們被壓縮。它只支援insert和select,支援自增鍵及其上的索引,不支援其他索引。它適合做日誌記錄,使用者行為分析,不需要更新,刪除和索引的資料

二.悲觀鎖與樂觀鎖

(1)悲觀鎖(pessimistic lock)

悲觀鎖的特點是先獲取鎖,再進行業務操作,即「悲觀」的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的「一鎖二查三更新」即指的是使用悲觀鎖。通常來講在資料庫上的悲觀鎖需要資料庫本身提供支援,即通過常用的select … for update操作來實現悲觀鎖。當資料庫執行select for update時會獲取被select中的資料行的行鎖,因此其他併發執行的select for update如果試圖選中同一行則會發生排斥(需要等待行鎖被釋放),因此達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。

這裡需要注意的一點是不同的資料庫對select for update的實現和支援都是有所區別的,例如oracle支援select for update no wait,表示如果拿不到鎖立刻報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中所有掃瞄過的行都會被鎖上,這一點很容易造成問題。因此如果在mysql中用悲觀鎖務必要確定走了索引,而不是全表掃瞄。

(2)樂觀鎖(optimistic lock)

樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即「樂觀」的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新資料的最後一步再去拿一下鎖就好。

樂觀鎖在資料庫上的實現完全是邏輯的,不需要資料庫提供特殊的支援。一般的做法是在需要鎖的資料上增加乙個版本號,或者時間戳,然後按照如下方式實現:

複製**

1. select data as old_data, version as old_version from …;

2. 根據獲取的資料進行業務操作,得到new_data和new_version

3. update set data = new_data, version = new_version where version = old_version

if (updated row > 0) else

樂觀鎖是否在事務中其實都是無所謂的,其底層機制是這樣:在資料庫內部update同一行的時候是不允許併發的,即資料庫每次執行一條update語句時會獲取被update行的寫鎖,直到這一行被成功更新後才釋放。因此在業務操作進行前獲取需要鎖的資料的當前版本號,然後實際更新資料時再次對比版本號確認與之前獲取的相同,並更新版本號,即可確認這之間沒有發生併發的修改。如果更新失敗即可認為老版本的資料已經被併發修改掉而不存在了,此時認為獲取鎖失敗,需要回滾整個業務操作並可根據需要重試整個過程。

總結樂觀鎖在不發生取鎖失敗的情況下開銷比悲觀鎖小,但是一旦發生失敗回滾開銷則比較大,因此適合用在取鎖失敗概率比較小的場景,可以提公升系統併發效能

樂觀鎖還適用於一些比較特殊的場景,例如在業務操作過程中無法和資料庫保持連線等悲觀鎖無法適用的地方

MYSQL常用儲存引擎

一 innodb 儲存引擎 innodb 儲存引擎自 mysql 5.5 版本起被指定為預設的儲存引擎,用於完成事務 回滾 崩潰修復和多版本併發控制的事務安全處理。同時也是 mysql中第乙個提供外來鍵約束的表引擎,尤其對事務處理的能力,是 mysql 其他儲存引擎所無法與之比擬的。innodb 的...

常用Mysql儲存引擎

innodb是事務型資料庫的首選引擎,支援事物安全表 acid 支援行鎖定和外來鍵。mysql5.5.5之後,innodb作為預設引擎。innodb主要特性 1.innodb給mysql提供 回滾和崩潰恢復能力的事物安全 acid相容 儲存引擎。innodb鎖定在行級並且也在select語句中提供乙...

MySQL常用的儲存引擎

mysql常用的儲存引擎為myisam innodb memory merge,其中innodb提供事務安全表,其他儲存引擎都是非事務安全表。myisam是mysql的預設儲存引擎。myisam不支援事務 也不支援外來鍵,但其訪問速度快,對事務完整性沒有要求。innodb儲存引擎提供了具有提交 回滾...