儲存引擎在mysql的邏輯架構中位於第三層,負責mysql中的資料的儲存和提取。mysql儲存引擎有很多,不同的儲存引擎儲存資料和索引的方式是不同的。每一種儲存引擎都有它的優勢和劣勢,本文只討論最常見的innodb和myisam兩種儲存引擎進行討論。本文中關於資料儲存形式和索引的可以檢視**mysql索引
mysql邏輯架構圖:
innodb是預設的事務型儲存引擎,也是最重要,使用最廣泛的儲存引擎。在沒有特殊情況下,一般優先使用innodb儲存引擎。
1️⃣、資料儲存形式
使用innodb時,會將資料表分為.frm 和 idb兩個檔案進行儲存。
2️⃣、鎖的粒度
innodb採用mvcc(多版本併發控制)來支援高併發,innodb實現了四個隔離級別,預設級別是repetable read,並通過間隙鎖策略防止幻讀的出現。它的鎖粒度是行鎖。【通過mvcc實現,mvcc在稍後會進行介紹】
3️⃣、事務
innodb是典型的事務型儲存引擎,並且通過一些機制和工具,支援真正的熱備份。
4️⃣、資料的儲存特點
innodb表是基於聚簇索引(另一篇部落格有介紹)建立的,聚簇索引對主鍵的查詢有很高的效能,不過他的二級索引(非主鍵索引)必須包含主鍵列,索引其他的索引會很大。
1️⃣、資料儲存形式
myisam採用的是索引與資料分離的形式,將資料儲存在三個檔案中.frm.myd,.myis。
2️⃣、鎖的粒度
myisam不支援行鎖,所以讀取時對錶加上共享鎖,在寫入是對錶加上排他鎖。由於是對整張表加鎖,相比innodb,在併發寫入時效率很低。
3️⃣、事務
myisam不支援事務。
4️⃣、資料的儲存特點
myisam是基於非聚簇索引進行儲存的。
5️⃣、其他
myisam提供了大量的特性,包括全文索引,壓縮,空間函式,延遲更新索引鍵等。
進行壓縮後的表是不能進行修改的,但是壓縮表可以極大減少磁碟占用空間,因此也可以減少磁碟io,從而提供查詢效能。
全文索引,是一種基於分詞建立的索引,可以支援複雜的查詢。
延遲更新索引鍵,不會將更新的索引資料立即寫入到磁碟,而是會寫到記憶體中的緩衝區中,只有在清除緩衝區時候才會將對應的索引寫入磁碟,這種方式大大提公升了寫入效能。
兩種儲存引擎各有各的有點,myisam專注效能,innodb專注事務。兩者最大的區別就是innodb支援事務,和行鎖。
如何在兩種儲存引擎中進行選擇?
① 是否有事務操作?有,innodb。
②是否儲存併發修改?有,innodb。
③是否追求快速查詢,且資料修改較少?是,myisam。
④是否使用全文索引?如果不引用第三方框架,可以選擇myisam,但是可以選用第三方框架和inndb效率會更高。
mysql大多數事務型儲存引擎實現的都不是簡單的行鎖。基於提公升併發效能的考慮,他們一般都同時實現了多版本併發控制(mvcc)。
可以認為mvcc是行級鎖的乙個變種,它能在大多數情況下避免加鎖操作,因此開銷更低。無論怎樣實現,它們大豆實現了非阻塞的讀操作,寫操作也只鎖定制定的行。
mvcc是通過儲存資料在某乙個時間點的快照來實現的,也就是說無論事務執行多久,每個事務看到的資料都是一致的。innodb的mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現,這兩個列乙個儲存了行的建立時間,乙個儲存了行的過期時間(或刪除時間),當然,並非儲存的是時間,而是系統版本號。每開啟乙個事務,版本號都會遞增,事務開始時刻的系統版本號會作為事務的版本號。
idname
建立時間(行版本號)
刪除時間(刪除版本號)
1mary
1null
2jann
1null
以innodb儲存引擎的的repeatable read隔離級別來說:
select
①只查詢建立時間版本號小於當前事務版本號的資料行(保證事務讀取的行要麼在事務開始之前就存在,要麼是事務本身插入的行)
②行的刪除版本號要麼未定義,要麼大於當前事務版本號,這樣可以確保事務讀取到的行,在開始事務之前未被刪除
只有復合上訴兩個條件的記錄才會作為結果返回
insert
為插入的資料儲存當前系統版本號作為行版本號
delete
儲存當前系統版本號作為刪除行版本號
update
插入一行資料,並將當前系統版本號賦予行版本號;同事儲存當前系統版本號到原來的行作為刪除版本號。
Mysql儲存引擎InnoDB與Myisam的區別
1,事務處理 innodb 支援事務功能,myisam 不支援。myisam 的執行速度更快,效能更好。2,select update insert delete 操作 myisam 如果執行大量的select,myisam是更好的選擇 innodb 如果你的資料執行大量的insert或update...
MYSQL儲存引擎InnoDB和myisam區別
mysql5.5之後的預設儲存引擎 如果你為乙個表指定auto increment列,在資料詞典裡的innodb表控制代碼包含乙個名為自動增長計數器的計數器,它被用在為該列賦新值。自動增長計數器僅被儲存在主記憶體中,而不是存在磁碟上 關於該計算器的演算法實現,請參考 auto increment列在...
MYSQL儲存引擎innodb和myisam的區別
innodb 預設事務型引擎,最重要最廣泛的儲存引擎,效能非常優秀,資料庫儲存在共享表空間,可以通過配置分開。對主鍵查詢的效能高於其他型別的儲存引擎。它內部做了很多優化,從磁碟讀取資料時自動在記憶體構建hash 雜湊 索引,插入資料時自動構建插入緩衝區。它可以通過一些機制和工具支援真正的熱備份,支援...