欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql中MyISAM和InnoDB的區(qū)別及說明

 更新時(shí)間:2022年12月26日 11:12:53   作者:楊 戩  
這篇文章主要介紹了Mysql中MyISAM和InnoDB的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MyISAM和InnoDB的區(qū)別

1. 定義

InnoDB:

InnoDB:MySQL默認(rèn)的事務(wù)型引擎,也是最重要和使用最廣泛的存儲(chǔ)引擎。

它被設(shè)計(jì)成為大量的短期事務(wù),短期事務(wù)大部分情況下是正常提交的,很少被回滾。InnoDB的性能與自動(dòng)崩潰恢復(fù)的特性,使得它在非事務(wù)存儲(chǔ)需求中也很流行。除非有非常特別的原因需要使用其他的存儲(chǔ)引擎,否則應(yīng)該優(yōu)先考慮InnoDB引擎。

MyISAM:

MyISAM:在MySQL 5.5 及之前的版本,MyISAM是默認(rèn)引擎。

MyISAM提供的大量的特性,包括全文索引、壓縮、空間函數(shù)(GIS)等,但MyISAM并不支持事務(wù)以及行級(jí)鎖,而且一個(gè)毫無(wú)疑問的缺陷是崩潰后無(wú)法安全恢復(fù)。正是由于MyISAM引擎的緣故,即使MySQL支持事務(wù)已經(jīng)很長(zhǎng)時(shí)間了,在很多人的概念中MySQL還是非事務(wù)型數(shù)據(jù)庫(kù)。盡管這樣,它并不是一無(wú)是處的。對(duì)于只讀的數(shù)據(jù),或者表比較小,可以忍受修復(fù)操作,則依然可以使用MyISAM(但請(qǐng)不要默認(rèn)使用MyISAM,而是應(yīng)該默認(rèn)使用InnoDB)

2. 區(qū)別

InnoDB 支持事務(wù),MyISAM 不支持事務(wù)。這是 MySQL 將默認(rèn)存儲(chǔ)引擎從 MyISAM 變成 InnoDB 的重要原因之一;

InnoDB 支持外鍵,而 MyISAM 不支持。對(duì)一個(gè)包含外鍵的 InnoDB 表轉(zhuǎn)為 MYISAM 會(huì)失??;

InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主鍵索引的葉子節(jié)點(diǎn)上,因此 InnoDB 必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數(shù)據(jù)。因此,主鍵不應(yīng)該過大,因?yàn)橹麈I太大,其他索引也都會(huì)很大。而 MyISAM 是非聚集索引,數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的。

InnoDB 不保存表的具體行數(shù),執(zhí)行 select count(*) from table 時(shí)需要全表掃描。而MyISAM 用一個(gè)變量保存了整個(gè)表的行數(shù),執(zhí)行上述語(yǔ)句時(shí)只需要讀出該變量即可,速度很快;

InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個(gè)更新語(yǔ)句會(huì)鎖住整張表,導(dǎo)致其他查詢和更新都會(huì)被阻塞,因此并發(fā)訪問受限。

這也是 MySQL 將默認(rèn)存儲(chǔ)引擎從 MyISAM 變成 InnoDB 的重要原因之一;

3. 使用

是否要支持事務(wù),如果要請(qǐng)選擇 InnoDB,如果不需要可以考慮 MyISAM;

如果表中絕大多數(shù)都只是讀查詢,可以考慮 MyISAM,如果既有讀寫也挺頻繁,請(qǐng)使用InnoDB。

系統(tǒng)奔潰后,MyISAM恢復(fù)起來(lái)更困難,能否接受,不能接受就選 InnoDB;

MySQL5.5版本開始Innodb已經(jīng)成為Mysql的默認(rèn)引擎(之前是MyISAM),說明其優(yōu)勢(shì)是有目共睹的。如果你不知道用什么存儲(chǔ)引擎,那就用InnoDB,至少不會(huì)差。

MyISAM和InnoDB索引結(jié)構(gòu)分析

存儲(chǔ)引擎作用于什么對(duì)象

存儲(chǔ)引擎是作用在表上的,而不是數(shù)據(jù)庫(kù)。

MyISAM和InnoDB對(duì)索引和數(shù)據(jù)的存儲(chǔ)在磁盤上是如何體現(xiàn)的

先來(lái)看下面創(chuàng)建的兩張表信息,role表使用的存儲(chǔ)引擎是MyISAM,而user使用的是InnoDB:

再來(lái)看下兩張表在磁盤中的索引文件和數(shù)據(jù)文件:

1. role表有三個(gè)文件,對(duì)應(yīng)如下:

  • role.frm:表結(jié)構(gòu)文件
  • role.MYD:數(shù)據(jù)文件(MyISAM Data)
  • role.MYI:索引文件(MyISAM Index)

2. user表有兩個(gè)文件,對(duì)應(yīng)如下:

  • user.frm:表結(jié)構(gòu)文件
  • user.ibd:索引和數(shù)據(jù)文件(InnoDB Data)

也由于兩種引擎對(duì)索引和數(shù)據(jù)的存儲(chǔ)方式的不同,我們也稱MyISAM的索引為非聚集索引,InnoDB的索引為聚集索引

MyISAM主鍵索引與輔助索引的結(jié)構(gòu)

我們先列舉一部分?jǐn)?shù)據(jù)出來(lái)分析,如下:

上面已經(jīng)說明了MyISAM引擎的索引文件和數(shù)據(jù)文件是分離的,我們接著看一下下面兩種索引結(jié)構(gòu)異同。

1. 主鍵索引:

上一篇文章已經(jīng)介紹過數(shù)據(jù)庫(kù)索引是采用B+Tree存儲(chǔ),并且只在葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),在MyISAM引擎中葉子結(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)其實(shí)是索引和數(shù)據(jù)的文件指針兩類。

如下圖中我們以Col1列作為主鍵建立索引,對(duì)應(yīng)的葉子結(jié)點(diǎn)儲(chǔ)存形式可以看一下表格。

通過索引查找數(shù)據(jù)的流程:先從索引文件中查找到索引節(jié)點(diǎn),從中拿到數(shù)據(jù)的文件指針,再到數(shù)據(jù)文件中通過文件指針定位了具體的數(shù)據(jù)。

2. 輔助(非主鍵)索引:

以Col2列建立索引,得到的輔助索引結(jié)構(gòu)跟上面的主鍵索引的結(jié)構(gòu)是相同的。

 

InnoDB主鍵索引與輔助索引的結(jié)構(gòu)

1. 主鍵索引:

我們已經(jīng)知道InnoDB索引是聚集索引,它的索引和數(shù)據(jù)是存入同一個(gè).idb文件中的,因此它的索引結(jié)構(gòu)是在同一個(gè)樹節(jié)點(diǎn)中同時(shí)存放索引和數(shù)據(jù),如下圖中最底層的葉子節(jié)點(diǎn)有三行數(shù)據(jù),對(duì)應(yīng)于數(shù)據(jù)表中的Col1、Col2、Col3數(shù)據(jù)項(xiàng)。

2. 輔助(非主鍵)索引:

這次我們以數(shù)據(jù)表中的Col3列的字符串?dāng)?shù)據(jù)建立輔助索引,它的索引結(jié)構(gòu)跟主鍵索引的結(jié)構(gòu)有很大差別,我們來(lái)看下面的圖:

在最底層的葉子結(jié)點(diǎn)有兩行數(shù)據(jù),第一行的字符串是輔助索引,按照ASCII碼進(jìn)行排序,第二行的整數(shù)是主鍵的值。

InnoDB索引結(jié)構(gòu)需要注意的點(diǎn)

  • 1. 數(shù)據(jù)文件本身就是索引文件
  • 2. 表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu)文件
  • 3. 聚集索引中葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄
  • 4. InnoDB表必須要有主鍵,并且推薦使用整型自增主鍵

正如我們上面介紹InnoDB存儲(chǔ)結(jié)構(gòu),索引與數(shù)據(jù)是共同存儲(chǔ)的,不管是主鍵索引還是輔助索引,在查找時(shí)都是通過先查找到索引節(jié)點(diǎn)才能拿到相對(duì)應(yīng)的數(shù)據(jù),如果我們?cè)谠O(shè)計(jì)表結(jié)構(gòu)時(shí)沒有顯式指定索引列的話,MySQL會(huì)從表中選擇數(shù)據(jù)不重復(fù)的列建立索引,如果沒有符合的列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,并且這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類型為整型。

那為什么推薦使用整型自增主鍵而不是選擇UUID?

UUID是字符串,比整型消耗更多的存儲(chǔ)空間;

在B+樹中進(jìn)行查找時(shí)需要跟經(jīng)過的節(jié)點(diǎn)值比較大小,整型數(shù)據(jù)的比較運(yùn)算比字符串更快速;

自增的整型索引在磁盤中會(huì)連續(xù)存儲(chǔ),在讀取一頁(yè)數(shù)據(jù)時(shí)也是連續(xù);UUID是隨機(jī)產(chǎn)生的,讀取的上下兩行數(shù)據(jù)存儲(chǔ)是分散的,不適合執(zhí)行where id > 5 && id < 20的條件查詢語(yǔ)句。

在插入或刪除數(shù)據(jù)時(shí),整型自增主鍵會(huì)在葉子結(jié)點(diǎn)的末尾建立新的葉子節(jié)點(diǎn),不會(huì)破壞左側(cè)子樹的結(jié)構(gòu);UUID主鍵很容易出現(xiàn)這樣的情況,B+樹為了維持自身的特性,有可能會(huì)進(jìn)行結(jié)構(gòu)的重構(gòu),消耗更多的時(shí)間。

為什么非主鍵索引結(jié)構(gòu)葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵值?

保證數(shù)據(jù)一致性和節(jié)省存儲(chǔ)空間,可以這么理解:商城系統(tǒng)訂單表會(huì)存儲(chǔ)一個(gè)用戶ID作為關(guān)聯(lián)外鍵,而不推薦存儲(chǔ)完整的用戶信息,因?yàn)楫?dāng)我們用戶表中的信息(真實(shí)名稱、手機(jī)號(hào)、收貨地址···)修改后,不需要再次維護(hù)訂單表的用戶數(shù)據(jù),同時(shí)也節(jié)省了存儲(chǔ)空間。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql 動(dòng)態(tài)生成測(cè)試數(shù)據(jù)

    mysql 動(dòng)態(tài)生成測(cè)試數(shù)據(jù)

    mysql 動(dòng)態(tài)生成測(cè)試數(shù)據(jù)的語(yǔ)句,方便測(cè)試數(shù)據(jù)。
    2009-08-08
  • mysql千萬(wàn)級(jí)數(shù)據(jù)分頁(yè)查詢性能優(yōu)化

    mysql千萬(wàn)級(jí)數(shù)據(jù)分頁(yè)查詢性能優(yōu)化

    本文給大家分享的是作者在使用mysql進(jìn)行千萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢的時(shí)候進(jìn)行性能優(yōu)化的方法,非常不錯(cuò)的一篇文章,對(duì)我們學(xué)習(xí)mysql性能優(yōu)化非常有幫助
    2017-11-11
  • 解決Navicat Premium 連接 MySQL 8.0 報(bào)錯(cuò)

    解決Navicat Premium 連接 MySQL 8.0 報(bào)錯(cuò)"1251"的問題分析

    這篇文章主要介紹了解決Navicat Premium 連接 MySQL 8.0 報(bào)錯(cuò)"1251"的問題分析,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • MySQL on k8s 云原生環(huán)境部署

    MySQL on k8s 云原生環(huán)境部署

    這篇文章主要為大家介紹了MySQL on k8s 云原生環(huán)境部署實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • MySQL問答系列之如何避免ibdata1文件大小暴漲

    MySQL問答系列之如何避免ibdata1文件大小暴漲

    MySql innodb如果是共享表空間,ibdata1文件會(huì)越來(lái)越大,所以下面這篇文章主要給大家介紹了關(guān)于MySQL問答系列之如何避免ibdata1文件大小暴漲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • 一文帶你了解MySQL的左連接與右連接

    一文帶你了解MySQL的左連接與右連接

    在MySQL中,左查詢和右查詢是通過使用LEFT?JOIN和RIGHT?JOIN關(guān)鍵字來(lái)執(zhí)行的,本文通過詳細(xì)的代碼示例簡(jiǎn)單介紹這兩種查詢方法的語(yǔ)法,需要的朋友可以參考下
    2023-07-07
  • mysql一次將多條不同sql查詢結(jié)果并封裝到一個(gè)結(jié)果集的實(shí)現(xiàn)方法

    mysql一次將多條不同sql查詢結(jié)果并封裝到一個(gè)結(jié)果集的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于mysql一次將多條不同sql查詢結(jié)果并封裝到一個(gè)結(jié)果集的實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 刪除MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單教程

    刪除MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單教程

    這篇文章主要介紹了刪除MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • MySQL按照漢字的拼音排序簡(jiǎn)單實(shí)例

    MySQL按照漢字的拼音排序簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇MySQL按照漢字的拼音排序簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-01-01
  • 深入淺析MySQL?Explain

    深入淺析MySQL?Explain

    這篇文章主要介紹了MySQL?Explain詳解,expain出來(lái)的信息有10列,分別是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,本文對(duì)每一字段進(jìn)行逐一解釋,需要的朋友可以參考下
    2022-07-07

最新評(píng)論