吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

寫一寫MySQL常見的引擎

阿銘linux ? 來源:阿銘linux ? 2023-02-08 09:50 ? 次閱讀

本來這篇文檔只想寫Myisam和Innodb兩個存儲引擎的區別,畢竟這個話題也是面試中經常被問到的。但,Myisam存儲引擎由于不支持事務以及不支持行級鎖,用的人越來越少了。所以,干脆寫一寫MySQL常見的引擎吧。

什么是MySQL存儲引擎

所謂存儲,就是存數據的介質,而存儲引擎就是一種存儲數據的方式,就好比磁盤里的文件系統。不同的存儲引擎,存儲數據的方式不同,實現的功能點也不同。MySQL8.0默認的存儲引擎為Innodb。

MySQL存儲引擎都有哪些

在MySQL8里,可以執行show engines;來查看所有支持的存儲引擎。

a1888970-a731-11ed-bfe3-dac502259ad0.png

查看某個表是什么存儲引擎:

a198b750-a731-11ed-bfe3-dac502259ad0.png

不同的存儲引擎都有各自的特點,以適應不同的需求,我只針對下面3個常見的存儲引擎做出對比,如下表所示:

a1a6b1b6-a731-11ed-bfe3-dac502259ad0.png

MyISAM存儲引擎

在MySQL5.5之前的版本,默認使用該存儲引擎。若使用該存儲引擎,每個表會在磁盤上存儲成三個文件:

frm文件:存儲表的定義數據

MYD文件:存放表具體記錄的數據

MYI文件:存儲索引

Frm和MYI可以存放在不同的目錄下。MYI文件用來存儲索引,但僅保存記錄所在頁的指針,索引的結構是B+樹結構。

支持數據的類型也有三種:

1)靜態固定長度表

這種方式的優點在于存儲速度非常快,容易發生緩存,而且表發生損壞后也容易修復。缺點是占空間。這也是默認的存儲格式。

2)動態可變長表

優點是節省空間,但是一旦出錯恢復起來比較麻煩。

3)壓縮表

上面說到支持數據壓縮,說明肯定也支持這個格式。在數據文件發生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復。

MyISAM存儲引擎有一個重要的特點那就是不支持事務,但是這也意味著它的存儲速度更快,如果你的讀寫操作允許有錯誤數據的話,只是追求速度,可以選擇這個存儲引擎。

InnoDB存儲引擎

InnoDB是MySQL8.0版本默認的數據庫存儲引擎,他的主要特點有:

可以通過自動增長列,方法是auto_increment。

支持事務。默認的事務隔離級別為可重復度,通過MVCC(并發版本控制)來實現的。

使用的鎖粒度為行級鎖,可以支持更高的并發;

支持外鍵約束;外鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。

配合一些熱備工具可以支持在線熱備份;

在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數據全部緩存起來,加快查詢的速度;

對于InnoDB類型的表,其數據的物理組織形式是聚簇表。所有的數據按照主鍵來組織。數據和索引放在一塊,都位于B+數的葉子節點上;

當然InnoDB的存儲表和索引也有下面兩種形式:

使用共享表空間存儲:所有的表和索引存放在同一個表空間中。

使用多表空間存儲:表結構放在frm文件,數據和索引放在IBD文件中。分區表的話,每個分區對應單獨的IBD文件,分區表的定義可以查看我的其他文章。使用分區表的好處在于提升查詢效率。

對于InnoDB來說,最大的特點在于支持事務。但是這是以損失效率來換取的。

Memory存儲引擎

將數據存在內存,為了提高數據的訪問速度,每一個表實際上和一個磁盤文件關聯。文件是frm。Memroy存儲引擎主要有以下特點:

支持的數據類型有限制,比如:不支持TEXT和BLOB類型,對于字符串類型的數據,只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;

支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;

由于數據是存放在內存中,一旦服務器出現故障,數據都會丟失;

查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的字段,那么這個臨時表就會轉化為MyISAM類型的表,性能會急劇降低;

默認使用hash索引。

如果一個內部表很大,會轉化為磁盤表。

MyISAM對比Innodb

再來做一個總結吧,面試中被問到,可以簡單說說下面幾個要點:

存儲結構

MyISAM:每個MyISAM在磁盤上存儲成三個文件。分別為:表定義文件、數據文件、索引文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名為.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限于操作系統文件的大小,一般為2GB

存儲空間

MyISAM支持支持三種不同的存儲格式:靜態表(默認,但是注意數據末尾不能有空格,會被去掉)、動態表、壓縮表。當表在創建之后并導入數據之后,不會再進行修改操作,可以使用壓縮表,極大的減少磁盤的空間占用。
InnoDB需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。

可移植性、備份及恢復

MyISAM:數據是以文件的形式存儲,所以在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作。
InnoDB:免費的方案可以是拷貝數據文件、備份 binlog,或者用mysqldump,在數據量達到幾十G的時候就相對痛苦了。

事務支持

MyISAM:強調的是性能,每次查詢具有原子性,其執行速度比InnoDB類型更快,但是不提供事務支持。
InnoDB:提供事務支持、外部鍵等高級數據庫功能。

是否支持行級鎖

MyISAM:只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以后的表滿足insert并發的情況下,可以在表的尾部插入新的數據。
InnoDB:支持事務和行級鎖,是Innodb的最大特色。行鎖大幅度提高了多用戶并發操作的性能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。

是否支持聚集索引

MyISAM不支持聚集索引,InnoDB支持聚集索引。

外鍵

MyISAM:不支持
InnoDB:支持

全文索引

MyISAM支持 FULLTEXT類型的全文索引。
InnoDB不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

表主鍵

MyISAM允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
對于InnoDB,如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字節的主鍵(用戶不可見)。

表的行數

MyISAM保存有表的總行數,如果select count() from table;會直接取出出該值。
InnoDB沒有保存表的總行數,如果使用select count() from table;就會遍歷整個表,消耗相當大,但是在加了where條件后,MyISAM和InnoDB處理的方式都一樣。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SAM
    SAM
    +關注

    關注

    0

    文章

    113

    瀏覽量

    33576
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26742
  • Hash
    +關注

    關注

    0

    文章

    32

    瀏覽量

    13248
  • MVCC
    +關注

    關注

    0

    文章

    13

    瀏覽量

    1489

原文標題:來聊聊MySQL的存儲引擎

文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    個登陸界面的程序框圖,跪求高手幫忙一寫

    個登陸界面的程序框圖,跪求高手幫忙一寫,好多控件找不到,麻煩大神寫成程序框圖,我郵箱1002435704@qq.com,麻煩了
    發表于 06-04 21:24

    功能全局變量儲存事件引用,一寫樣請問是什么原因?

    本帖最后由 只耳朵怪 于 2018-5-29 09:00 編輯 功能全局變量儲存事件引用 一寫樣 是有時候
    發表于 05-28 18:12

    mysql的存儲引擎選擇方法

    mysql怎么選擇合適的存儲引擎
    發表于 08-08 07:26

    在MCU開發中使用多線程操作一寫讀是否需要保護?

    在MCU(以常見的stm32為例)開發中使用多線程操作,我們經常遇到的問題是關于多線程訪問數據的問題,多線程訪問數據基本上可以分為幾大類:多讀多多讀
    發表于 02-01 15:42

    keil軟件一寫空函數就顯示目標沒創建的原因?

    keil 軟件 為啥我一寫空函數就顯示目標沒創建?
    發表于 10-17 07:41

    基于三元Golay隱碼的快速隱算法

    研究GF(3)上的編碼方法,利用三元Golay碼給出種GF(3)上的隱碼,其隱性能較常見二元隱碼有顯著提高。提出基于三元Golay隱
    發表于 04-08 08:46 ?26次下載

    種具有分級安全的文本隱方法

    針對單數據類型隱方法安全性不高、隱容量不足等問題,提出了種具有分級安全的文本隱方法。首先,將整個載體文檔中的多種類型的數據作為備選
    發表于 01-14 16:26 ?0次下載

    LSB匹配隱檢測

    目前,在數字圖像隱中,基于空域和頻域隱的研究最為廣泛。基于空域隱的研究起步較早,典型的隱方法如最不重要位(Least Significant Bit,LSB)替換隱
    發表于 02-23 09:55 ?2次下載

    什么是單片機燒軟件?如何燒

    什么是單片機燒軟件? 什么是單片機燒軟件? 簡單點說,就是把你寫好代碼(C或者是匯編)專程的機器語言通過定的方式下載到單片機中。稱為燒。 燒
    發表于 04-14 11:04 ?3.5w次閱讀

    對講機頻的常見問題及解決方案

    對講機在使用過程中難免要修改和調整對講機的頻率,這個時候就需要按裝頻軟件重新設置頻率。今天小編就對講機在頻過程中會遇到的常見問題做了
    的頭像 發表于 07-20 11:24 ?3.2w次閱讀

    怎樣選擇存儲引擎MySQL存儲引擎怎么樣?

    MySQL是我們經常使用的數據庫處理系統(DBMS),不知小伙伴們有沒有注意過其中的“存儲引擎”(storage_engine)呢?有時候面試題中也會問道MySQL幾種常用的存儲引擎
    的頭像 發表于 09-02 10:15 ?4838次閱讀

    三種常見的STM32單片機的燒方法

    三種常見的STM32單片機的燒方法
    發表于 05-28 09:57 ?34次下載

    stm32使用flymcu燒程序

    文章目錄、使用flymcu燒程序、使用flymcu燒程序燒程序之前要使ASP指示燈保持強亮狀態,同時要保證使flashIsp模式下
    發表于 10-26 11:06 ?18次下載
    stm32使用flymcu燒<b class='flag-5'>寫</b>程序

    stm32單片機的命令與數據

    指令和數據,都是針對外部應用模塊的,比如1 602液晶屏,命令是告訴液晶屏你要做什么,數據是把你要顯示的數據送給液晶屏。
    發表于 11-19 09:21 ?7次下載
    stm32單片機的<b class='flag-5'>寫</b>命令與<b class='flag-5'>寫</b>數據

    來練習Redis部署的腳本

    繼Nginx和MySQL的部署腳本之后,相信只要你跟著寫了,那么里面的很多關鍵精髓你已經知曉,今天就來練習Redis部署的腳本吧。
    的頭像 發表于 12-01 09:16 ?818次閱讀
    百家乐蔬菜配送公司| 百家乐输一押二| 澳门赌场| 百家乐试玩全讯网2| 正镶白旗| 威尼斯人娱乐城怎么样| 东营区百家乐官网艺术团| 六合彩大全| 网络百家乐必胜投注方法| 明升百家乐官网QQ群| 大发888出纳柜| 百家乐视频游戏帐号| 新2百家乐官网娱乐城| 百家乐现金游戏注册送彩金| 百家乐官网和21点| 大发888电话多少| 马牌百家乐现金网| 网上百家乐官网返水| bet365网址主页| 百家乐赌博现金网平台排名| 百家乐官网平台凯发| 盈丰国际博彩网| 大发888游戏注册| 网上百家乐作弊不| 百家乐官网三跳| 澄江县| 大发888 注册账号| 百家乐与21点| 红桃K百家乐官网娱乐城| qq百家乐官网网络平台| 赌博游戏| 大发888怎么样| 劳力士百家乐的玩法技巧和规则 | 百家乐博娱乐网赌百家乐| 免费百家乐规则| 澳门百家乐官网娱乐平台| 普宁市| 永利娱乐城提款| 大发888官方下载 网站| 全讯网百家乐的玩法技巧和规则| 择日自学24|