淺談MySQL儲存引擎-InnoDB&MyISAM

來源:互聯網
上載者:User

標籤:如何   部落格   同事   提取   關於   清除   個人   壓縮   因此   

儲存引擎在MySQL的邏輯架構中位於第三層,負責MySQL中的資料的儲存和提取。MySQL儲存引擎有很多,不同的儲存引擎儲存資料和索引的方式是不同的。每一種儲存引擎都有它的優勢和劣勢,本文只討論最常見的InnoDB和MyISAM兩種儲存引擎進行討論。本文中關於資料存放區形式和索引的可以查看圖解MySQL索引

MySQL邏輯架構圖:

InnoDB儲存引擎

InnoDB是預設的事務型儲存引擎,也是最重要,使用最廣泛的儲存引擎。在沒有特殊情況下,一般優先使用InnoDB儲存引擎。

1??、資料存放區形式

使用InnoDB時,會將資料表分為.frm 和 idb兩個檔案進行儲存。

2??、鎖的粒度

InnoDB採用MVCC(多版本並發控制)來支援高並發,InnoDB實現了四個隔離等級,預設層級是REPETABLE READ,並通過間隙鎖策略防止幻讀的出現。它的鎖粒度是行鎖。【通過MVCC實現,MVCC在稍後會進行介紹】

3??、事務

InnoDB是典型的事務型儲存引擎,並且通過一些機制和工具,支援真正的熱備份。

4??、資料的儲存特點

InnoDB表是基於聚簇索引(另一篇部落格有介紹)建立的,聚簇索引對主鍵的查詢有很高的效能,不過他的二級索引(非主鍵索引)必須包含主鍵列,索引其他的索引會很大。

MyISAM儲存引擎

1??、資料存放區形式

MyISAM採用的是索引與資料分離的形式,將資料儲存在三個檔案中.frm.MYD,.MYIs。

2??、鎖的粒度

MyISAM不支援行鎖,所以讀取時對錶加上共用鎖定,在寫入是對錶加上獨佔鎖定。由於是對整張表加鎖,相比InnoDB,在並發寫入時效率很低。

3??、事務

MyISAM不支援事務。

4??、資料的儲存特點

MyISAM是基於非聚簇索引進行儲存的。

5??、其他

MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數,延遲更新索引鍵等。

進行壓縮後的表是不能進行修改的,但是壓縮表可以極大減少磁碟佔用空間,因此也可以減少磁碟IO,從而提供查詢效能。

全文索引,是一種基於分詞建立的索引,可以支援複雜的查詢。

延遲更新索引鍵,不會將更新的索引資料立即寫入到磁碟,而是會寫到記憶體中的緩衝區中,只有在清除緩衝區時候才會將對應的索引寫入磁碟,這種方式大大提升了寫入效能。

三、對比與選擇

兩種儲存引擎各有各的有點,MyISAM專註效能,InnoDB專註事務。兩者最大的區別就是InnoDB支援事務,和行鎖。

如何在兩種儲存引擎中進行選擇?

① 是否有事務操作?有,InnoDB。

②是否儲存並發修改?有,InnoDB。

③是否追求快速查詢,且資料修改較少?是,MyISAM。

④是否使用全文索引?如果不引用第三方架構,可以選擇MyISAM,但是可以選用第三方架構和InnDB效率會更高。

四、淺談MVCC

MySQL大多數事務型儲存引擎實現的都不是簡單的行鎖。基於提升並發效能的考慮,他們一般都同時實現了多版本並發控制(MVCC)。

可以認為MVCC是行級鎖的一個變種,它能在大多數情況下避免加鎖操作,因此開銷更低。無論怎樣實現,它們大豆實現了非阻塞的讀操作,寫操作也只鎖定製定的行。

MVCC是通過儲存資料在某一個時間點的快照來實現的,也就是說無論事務執行多久,每個事務看到的資料都是一致的。InnoDB的MVCC,是通過在每行記錄後面儲存兩個隱藏的列來實現,這兩個列一個儲存了行的建立時間,一個儲存了行的到期時間(或刪除時間),當然,並非儲存的是時間,而是系統版本號碼。每開啟一個事務,版本號碼都會遞增,事務開始時刻的系統版本號碼會作為事務的版本號碼。

id name 建立時間(行版本號碼) 刪除時間(刪除版本號碼)
1 Mary 1 null
2 Jann 1 null

以InnoDB儲存引擎的的REPEATABLE READ隔離等級來說:

SELECT

? ①只查詢建立時間版本號碼小於當前事務版本號碼的資料行(保證事務讀取的行要麼在事務開始之前就存在,要麼是事務本身插入的行)

? ②行的刪除版本號碼要麼未定義,要麼大於當前事務版本號碼,這樣可以確保事務讀取到的行,在開始事務之前未被刪除

只有複合上訴兩個條件的記錄才會作為結果返回

INSERT

? 為插入的資料儲存當前系統版本號碼作為行版本號碼

DELETE

? 儲存當前系統版本號碼作為刪除行版本號碼

?

UPDATE

? 插入一行資料,並將當前系統版本號碼賦予行版本號碼;同事儲存當前系統版本號碼到原來的行作為刪除版本號碼。

註:MVCC只在REPEATABLE和READ COMMITTED兩個隔離等級下才能正常工作。
我的個人部落格:李強的個人部落格(基於SSM,Nginx+Redis的後台架構)

淺談MySQL儲存引擎-InnoDB&MyISAM

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.