MySQL 你要搞清楚儲存引擎之間的差別,喲

2021-10-04 18:21:29 字數 3651 閱讀 5918

目錄

1.概況對比

2.索引對比

2.1 innodb

2.1.1 聚集索引

2.2 myisam

3.事務

4.鎖對比各個儲存引擎之間的特性

特性innodb

myisam

memory

merge

ndb事務√✕

✕✕✕外來鍵

√✕✕✕

✕鎖粒度

行鎖表粒度表表

行索引b+樹集群索引

b+樹全文索引

b+樹雜湊

b+樹b+樹

雜湊快取

索引快取

資料快取

索引索引

資料索引

索引資料

time

批量插入效率

高高高

高space

記憶體磁碟

低中等n/a 無

低高低儲存限制

64tb

無受記憶體限制無無

mysql引擎

說明

myisam

記憶體中只快取索引,不快取資料;

不支援事務;

只支援表級鎖,支援insert操作和select操作併發進行;

適合讀多寫少的應用,如web;

支援全文索引;

innodb

索引和資料都可以快取到記憶體中;

支援事務;

支援行級鎖,可實現更高的併發度;

支援故障恢復;

支援外來鍵約束;

支援4種不同的事務隔離級別;

memory

所有資料均存在記憶體中,可提供高速的查詢效率;

一旦重啟資料庫(包括宕機),將丟失所有資料;

不支援blob和text型別;

資料大小必須小於記憶體容量;

其它特性類似於myisam;

merge

將一系列等同的myisam表以邏輯方式組合在一起,並作為1個物件引用它們。

高併發時,會導致適用的檔案控制代碼數劇增;

適用於資料倉儲等環境。

archive

可將大量的資料壓縮儲存;

不支援索引;

支援insert和select,不支援delete, replace和 update;

支援行級鎖;

federated

能夠將多個分離的mysql伺服器鏈結起來,從多個物理伺服器建立乙個邏輯資料庫;

不支援事務;

不支援alter table等直接修改表結構的ddl操作;

不支援prepare語句;

不支援查詢快取;

blackhole

不會儲存任何資料,僅記錄日誌;

適用於日誌統計、過濾、同步中間層等;

csv將資料以逗號分隔的格式儲存在文字檔案中;

不支援索引;

可以分為聚集索引(clustered inex)和輔助索引(secondary index),聚集索引與輔助索引不同的是,聚集葉子節點存放的是行資訊,而輔助索引存放的是主鍵id。所以在通過輔助索引查詢行記錄時,先從輔助索引的樹上找到葉子,再用葉子上的主鍵id在聚集索引的b+樹上查詢到行記錄,這也是為什麼叫二級索引的原因。

表中資料按照主鍵順序存放。而聚集索引(clustered index)就是按照每張表的主鍵構造一棵b+樹,同時葉子節點中存放的即為整張表的行記錄資料,也將聚集索引的葉子節點稱為資料頁,資料頁上存放的是完整的每行的記錄,而(內節點)存放的僅僅是鍵值及指向資料頁的偏移量。由於葉節點存放了innodb寫的處理效率差一些,並且會占用更多的磁碟空間以保留資料和索引。

內節點(索引頁)存放鍵值和頁偏移量葉節點(資料頁)存放行記錄(資料)頁內的記錄也是通過雙向鍊錶進行維護。

資料頁間通過雙向鍊錶鏈結,頁按照主鍵的順序排序;

不同於innodb的是資料頁上存放的是行記錄在磁碟上的位址,而不是實際的資料,也就是說如果通過myisam的主鍵id

只有innodb引擎支援事務,能夠保證資料的完整性和一致性,這也是為什麼大多數場景選擇innodb引擎的原因。事務會把資料庫從一種一致狀態轉換為另一種一致狀態。在資料庫提交工作時,可以確保要麼所有修改都已經儲存了,要麼所有修改都不儲存。主要是通過redo log和undo log實現的。

特性表現

實現原子性(atomicity)

要麼都做,要麼都不做

redo log

undo log 用於異常時回滾到之前的記錄

一致性(consistency)

資料庫的完整性約束沒有被破壞

唯一約束、外來鍵約束、業務不變式約束等

undo log

一旦事務中有語句破壞約束導致異常 回滾到之前的一致性狀態

隔離性(isolation)

每個事務對其他事務的操作記錄能相互分離

不可見其它併發事務的修改

鎖機制(序列化 隔離級別)

mvccundo log(讀已提交、可重複讀)

無(讀未提交 )沒有隔離

永續性(durability)

事務一旦提交,其結果就是永久性的。

即使發生宕機等故障,資料庫也能將資料恢復

redo log(刷盤比資料快)

宕機後可以按照重做日誌再執行恢復

鎖機制用於管理對共享資源的併發訪問,innodb儲存引擎會在行級別上對錶資料上鎖,其餘大部分僅支援表級,導致併發修改時阻塞等待。

innodb支援多粒度(granular)鎖定,允許事務在行級上的鎖和表級上的鎖同時存在。為了支援在不同粒度上加鎖,innodb引入意向鎖(intention lock)。意向鎖是將鎖定的物件分為多個層次,意向鎖意味著事務希望在更細粒度(fine granularity)上進行加鎖,如圖所示。如果需要對頁上的記錄r進行上x鎖,那麼分別需要對資料庫a、表1、頁上意向鎖ix,最後對記錄r上x鎖。

表型別語義

觸發語句

共享鎖s

讀一行資料

select...in share mode

排他鎖x

刪除或更新

insert、delete、update、select...for update

意向共享鎖is

預約加s鎖

加s前加

意向排他鎖ix

預約加x鎖

加x前加

搞清楚你的 Rails Version

目前使用 rails 的網站,version 分成好幾派。rails 0.x 的就是幾年前就開始在使用 rails 的始祖,據我所知國內也是有網站還再用 0.x 他們之所以死撐不換的原因只有乙個,就是怕公升級上去原本的 code 根本不相容。1.0 的時候我沒趕上,那可能要問一些長輩才知道 1.0 ...

要搞清楚物件和物件的引用

有很多程式設計師還在寫這樣的 user user new user user userdao.selectuserbyid id user.getname 他的理由是,為了防止執行user.getname 時發生空指標異常,所以先new出乙個物件,這樣即使從資料庫裡查詢不到對應id的使用者,程式也不...

bat中幾個要搞清楚的東西(一)

bat中enabledelayedexpansion用來設定變數的延遲擴充套件,通過以下語句可以開啟延遲擴充套件,setlocal enabledelayedexpansion這樣設定後變數的擴充套件時間將發生在execution時而不是變數 parse時,可以通過下邊的例子看出其作用。echo o...