MySQL 儲存引擎 1

2022-09-06 05:36:10 字數 4180 閱讀 4571

支援事務,而

myisam

不支援事務;

2、innodb

支援行級鎖,而

myisam

支援表級鎖;

3、innodb

支援mvcc,

而myisam

不支援;

4、innodb

支援外來鍵,而

myisam

不支援;

5、innodb

不支援全文索引,而

myisam

支援。mvcc(multiversion concurrency control),即多版本併發控制技術,它使得大部分支援行鎖的事務引擎,不再單純的使用行鎖來進行資料庫的併發控制,取而代之的是把資料庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高資料庫系統的併發效能

讀鎖:也叫共享鎖、s鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s 鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。

寫鎖:又稱排他鎖、x鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其他事務不能再對a加任何鎖,直到t釋放a上的鎖。這保證了其他事務在t釋放a上的鎖之前不能再讀取和修改a。

表鎖:操作物件是資料表。mysql大多數鎖策略都支援(常見mysql innodb),是系統開銷最低但併發性最低的乙個鎖策略。事務t對整個表加讀鎖,則其他事務可讀不可寫,若加寫鎖,則其他事務增刪改都不行。

行級鎖:操作物件是資料表中的一行。是mvcc技術用的比較多的,但在myisam用不了,行級鎖用mysql的儲存引擎實現而不是mysql伺服器。但行級鎖對系統開銷較大,處理高併發較好。

innodb mvcc主要是為repeatable-read事務隔離級別做的。在此隔離級別下,a、b客戶端所示的資料相互隔離,互相更新不可見

了解innodb的行結構、read-view的結構對於理解innodb mvcc的實現由重要意義

innodb儲存的最基本row中包含一些額外的儲存資訊 data_trx_id,data_roll_ptr,db_row_id,delete bit

具體的執行過程

begin->用排他鎖鎖定該行->記錄redo log->記錄undo log->修改當前行的值,寫事務編號,回滾指標指向undo log中的修改前的行

上述過程確切地說是描述了update的事務過程,其實undo log分insert和update undo log,因為insert時,原始的資料並不存在,所以回滾時把insert undo log丟棄即可,而update undo log則必須遵守上述過程

下面分別以select、delete、 insert、 update語句來說明

select

innodb檢查每行資料,確保他們符合兩個標準:

1、innodb只查詢版本早於當前事務版本的資料行(也就是資料行的版本必須小於等於事務的版本),這確保當前事務讀取的行都是事務之前已經存在的,或者是由當前事務建立或修改的行

2、行的刪除操作的版本一定是未定義的或者大於當前事務的版本號,確定了當前事務開始之前,行沒有被刪除

符合了以上兩點則返回查詢結果。

insert

innodb為每個新增行記錄當前系統版本號作為建立id。

delete

innodb為每個刪除行的記錄當前系統版本號作為行的刪除id。

update

innodb複製了一行。這個新行的版本號使用了系統版本號。它也把系統版本號作為了刪除行的版本。

說明insert操作時 「建立時間」=db_row_id,這時,「刪除時間 」是未定義的;

update時,複製新增行的「建立時間」=db_row_id,刪除時間未定義,舊資料行「建立時間」不變,刪除時間=該事務的db_row_id;

delete操作,相應資料行的「建立時間」不變,刪除時間=該事務的db_row_id;

select操作對兩者都不修改,唯讀相應的資料

上述更新前建立undo log,根據各種策略讀取時非阻塞就是mvcc,undo log中的行就是mvcc中的多版本,這個可能與我們所理解的mvcc有較大的出入,一般我們認為mvcc有下面幾個特點:

就是每行都有版本號,儲存時根據版本號決定是否成功,聽起來含有樂觀鎖的味道,而innodb的實現方式是:

二者最本質的區別是,當修改資料時是否要排他鎖定,如果鎖定了還算不算是mvcc? 

innodb的實現真算不上mvcc,因為並沒有實現核心的多版本共存,undo log中的內容只是序列化的結果,記錄了多個事務的過程,不屬於多版本共存。但理想的mvcc是難以實現的,當事務僅修改一行記錄使用理想的mvcc模式是沒有問題的,可以通過比較版本號進行回滾;但當事務影響到多行資料時,理想的mvcc據無能為力了。

比如,如果transaciton1執行理想的mvcc,修改row1成功,而修改row2失敗,此時需要回滾row1,但因為row1沒有被鎖定,其資料可能又被transaction2所修改,如果此時回滾row1的內容,則會破壞transaction2的修改結果,導致transaction2違反acid。

理想mvcc難以實現的根本原因在於企圖通過樂觀鎖代替二段提交。修改兩行資料,但為了保證其一致性,與修改兩個分布式系統中的資料並無區別,而二提交是目前這種場景保證一致性的唯一手段。二段提交的本質是鎖定,樂觀鎖的本質是消除鎖定,二者矛盾,故理想的mvcc難以真正在實際中被應用,innodb只是借了mvcc這個名字,提供了讀的非阻塞而已。

MySQL(1) 儲存引擎

儲存引擎就是如何儲存資料 如何為儲存的資料建立索引 如何更新 查詢資料等技術的實現方法。因為在關聯式資料庫中資料是以表的形式儲存的,所以儲存引擎也可以稱為表型別 即儲存和操作此表的型別 在oracle和sqlserver等資料庫中只有一種儲存引擎,所有的資料儲存管理機制都是一樣的 而mysql資料庫...

mysql儲存引擎 mysql儲存引擎簡介

精品推薦 什麼是儲存引擎 mysql儲存引擎是資料庫如何儲存資料 怎樣建立索引以及如何查詢更新資料等技術的實現方法,資料通過使用不同的技術儲存在檔案中,使用不同的儲存機制 索引方式來提供不同的功能。在mysql這種關係型資料中心來說,資料是以表的方式來儲存的,因此,簡單點來說,儲存引擎就是儲存和操作...

mysql個儲存引擎 MySQL儲存引擎

mysql資料庫的體系架構如下圖所示 從上圖中可以看出,mysql主要分為以下幾個元件 連線池元件 管理服務和工具元件 sql介面元件 分析器元件 優化器元件 緩衝元件 外掛程式式儲存引擎 物理檔案 儲存引擎 其實就是指定表如何儲存資料,如何為儲存的資料建立索引以及如何更新 查詢資料等技術實現的方法...