日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

浅谈MySQL存储引擎-InnoDBMyISAM

發布時間:2023/11/28 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈MySQL存储引擎-InnoDBMyISAM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

淺談MySQL存儲引擎-InnoDB&MyISAM

存儲引擎在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,是通過在每行記錄后面保存兩個隱藏的列來實現,這兩個列一個保存了行的創建時間,一個保存了行的過期時間(或刪除時間),當然,并非存儲的是時間,而是系統版本號。每開啟一個事務,版本號都會遞增,事務開始時刻的系統版本號會作為事務的版本號。

idname創建時間(行版本號)刪除時間(刪除版本號)
1Mary1null
2Jann1null

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

SELECT

? ①只查詢創建時間版本號小于當前事務版本號的數據行(保證事務讀取的行要么在事務開始之前就存在,要么是事務本身插入的行)

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

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

INSERT

? 為插入的數據保存當前系統版本號作為行版本號

DELETE

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

?

UPDATE

? 插入一行數據,并將當前系統版本號賦予行版本號;同事保存當前系統版本號到原來的行作為刪除版本號。

注:MVCC只在REPEATABLE和READ COMMITTED兩個隔離級別下才能正常工作。
我的個人博客:李強的個人博客(基于SSM,Nginx+Redis的后臺架構)

總結

以上是生活随笔為你收集整理的浅谈MySQL存储引擎-InnoDBMyISAM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。