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

MySQL的存儲(chǔ)引擎InnoDB和MyISAM

 更新時(shí)間:2022年04月25日 14:20:07   作者:??YuShiwen????  
這篇文章主要介紹了MySQL的存儲(chǔ)引擎InnoDB和MyISAM,MyISAM?用的是非聚集索引方式,即數(shù)據(jù)和索引落在不同的兩個(gè)文件上,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下

1. MyISAM底層存儲(chǔ)

(非聚集索引方式)與InnoDB底層存儲(chǔ)(聚集索引方式)

1.1 MyISAM底層存儲(chǔ)(非聚集索引方式)

Myisam 創(chuàng)建表后生成的文件有三個(gè):

  • frm:創(chuàng)建表的語(yǔ)句
  • MYD:表里面的數(shù)據(jù)文件(myisam data)
  • MYI:表里面的索引文件(myisam index)

底層存儲(chǔ)方式:

  • MyISAM 用的是非聚集索引方式,即數(shù)據(jù)和索引落在不同的兩個(gè)文件上。
  • MyISAM 在建表時(shí)以主鍵作為 KEY 來(lái)建立主索引 B+樹(shù),樹(shù)的葉子節(jié)點(diǎn)存的是對(duì)應(yīng)數(shù)據(jù)的物理地址。
  • 當(dāng)我們?yōu)槟硞€(gè)字段添加索引時(shí),我們同樣會(huì)生成對(duì)應(yīng)字段的索引樹(shù),該字段的索引樹(shù)的葉子節(jié)點(diǎn)同樣是記錄了對(duì)應(yīng)數(shù)據(jù)的物理地址,然后也是拿著這個(gè)物理地址去數(shù)據(jù)文件里定位到具體的數(shù)據(jù)記錄。

圖片講解得很清楚,大家可以結(jié)合圖片看一下:

1.2 InnoDB底層存儲(chǔ)(聚集索引方式)

Innodb 創(chuàng)建表后生成的文件有兩個(gè):

  • frm:創(chuàng)建表的語(yǔ)句
  • idb:表里面的數(shù)據(jù)+索引文件

底層存儲(chǔ)方式:

  • InnoDB 是聚集索引方式,因此數(shù)據(jù)和索引都存儲(chǔ)在同一個(gè)文件里。
  • InnoDB 在建表時(shí)以主鍵作為 KEY 來(lái)建立主索引 B+樹(shù),樹(shù)的葉子節(jié)點(diǎn)存的是主鍵ID和主鍵 ID 對(duì)應(yīng)的數(shù)據(jù)。
  • 當(dāng)我們?yōu)槟硞€(gè)字段添加索引時(shí),我們同樣會(huì)生成對(duì)應(yīng)字段的索引樹(shù),但是該字段的索引樹(shù)的葉子節(jié)點(diǎn)存儲(chǔ)的是該字段所在行的主鍵KEY,拿到主鍵 KEY 后,再去查詢一下主鍵索引樹(shù),才可以定位到具體數(shù)據(jù);也就是會(huì)進(jìn)行兩次查找。

圖片講解得很清楚,大家可以結(jié)合圖片看一下:

2. InnoDB與MyISAM簡(jiǎn)介

Mysql 底層數(shù)據(jù)引擎以插件形式設(shè)計(jì),最常見(jiàn)的是 Innodb 引擎和 Myisam 引擎,用戶可以根據(jù)個(gè)人需求選擇不同的引擎作為 Mysql 數(shù)據(jù)表的底層引擎。

  • MyISAM 存儲(chǔ)引擎

    • 是 MySQL 中常見(jiàn)的存儲(chǔ)引擎,雖然性能極佳, 擁有較高的插入,查詢速度,但卻不支持事務(wù)處理(transaction),不支持外鍵。曾(MySQL 5.5及之前版本)是 MySQL 的默認(rèn)存儲(chǔ)引擎。
  • InnoDB 存儲(chǔ)引擎

    • 是MySQL的數(shù)據(jù)庫(kù)引擎之一,現(xiàn)為MySQL的默認(rèn)存儲(chǔ)引擎,事務(wù)型數(shù)據(jù)庫(kù)的首選引擎,InnoDB是為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì),支持ACID事務(wù),支持行級(jí)鎖定。
    • 給MySQL提供了事務(wù)(transaction)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)、多版本并發(fā)控制(multi-versioned concurrency control)的事務(wù)安全(transaction-safe (ACID compliant))等功能。

ACID:

  • Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
  • Consistency(一致性):在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。這表示寫(xiě)入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫(kù)可以自發(fā)性地完成預(yù)定的工作。
  • Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。

3. MyISAM與InnoDB的比較

 MyISAMInnoDB
存儲(chǔ)結(jié)構(gòu)Myisam 創(chuàng)建表后生成的文件有三個(gè),分別為:
frm:創(chuàng)建表的語(yǔ)句
MYD:表里面的數(shù)據(jù)文件(myisam data)
MYI:表里面的索引文件(myisam index)
Innodb 創(chuàng)建表后生成的文件有兩個(gè),分別為:
frm:創(chuàng)建表的語(yǔ)句
idb:表里面的數(shù)據(jù)+索引文件
存儲(chǔ)空間MyISAM支持支持三種不同的存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會(huì)被去掉)、動(dòng)態(tài)表、壓縮表。當(dāng)表在創(chuàng)建之后并導(dǎo)入數(shù)據(jù)之后,不會(huì)再進(jìn)行修改操作,可以使用壓縮表,極大的減少磁盤(pán)的空間占用。需要更多的內(nèi)存和存儲(chǔ),它會(huì)在主內(nèi)存中建立其專(zhuān)用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
可移植性、備份及恢復(fù)數(shù)據(jù)是以文件的形式存儲(chǔ),所以在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中會(huì)很方便。在備份和恢復(fù)時(shí)可單獨(dú)針對(duì)某個(gè)表進(jìn)行操作;
MyISAM遇到錯(cuò)誤,必須完整掃描后才能重建索引,或修正未寫(xiě)入硬盤(pán)的錯(cuò)誤;
MyISAM的修復(fù)時(shí)間,與數(shù)據(jù)量的多少成正比。
在數(shù)據(jù)量很大的時(shí)候就相對(duì)痛苦;
InnoDB可借由事務(wù)記錄檔(Transaction Log)來(lái)恢復(fù)程序崩潰(crash),或非預(yù)期結(jié)束所造成的數(shù)據(jù)錯(cuò)誤;
InnoDB的修復(fù)時(shí)間,大略都是固定的。
索引非聚集索引,MyISAM 是非聚集索引,數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的。聚集索引,聚集索引的文件存放在主鍵索引的葉子節(jié)點(diǎn)上,因此 InnoDB 必須要有主鍵,通過(guò)主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過(guò)主鍵查詢到數(shù)據(jù)。因此,主鍵不應(yīng)該過(guò)大,因?yàn)橹麈I太大,其他索引也都會(huì)很大。
事務(wù)支持強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持。提供事務(wù)支持,外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。 具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表。
主鍵自增長(zhǎng)可以和其他字段一起建立聯(lián)合索引。引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引,自動(dòng)增長(zhǎng)可以不是第一列,他可以根據(jù)前面幾列進(jìn)行排序后遞增。InnoDB中必須包含只有該字段的索引。引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引也必須是組合索引的第一列。
鎖的粒度只支持表級(jí)鎖,用戶在操作myisam表時(shí),select,update,delete,insert語(yǔ)句都會(huì)給表自動(dòng)加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。支持行級(jí)鎖。行鎖大幅度提高了多用戶并發(fā)操作的性能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的。
全文索引支持 FULLTEXT類(lèi)型的全文索引不支持FULLTEXT類(lèi)型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
表主鍵允許沒(méi)有任何索引和主鍵的表存在,索引都是保存行的地址。如果沒(méi)有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見(jiàn)),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。
存儲(chǔ)表的具體行數(shù)保存有表的總行數(shù),如果select count() from table;會(huì)直接取出出該值。沒(méi)有保存表的總行數(shù),如果使用select count(*) from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
外鍵不支持支持,對(duì)一個(gè)包含外鍵的 InnoDB 表轉(zhuǎn)為 MYISAM 會(huì)失敗。

4. 存儲(chǔ)引擎的使用

什么時(shí)候用MyISAM數(shù)據(jù)存儲(chǔ)引擎?什么時(shí)候用InnoDB數(shù)據(jù)存儲(chǔ)引擎?

《高性能MySQL》中寫(xiě)道:

  • InnoDB:MySQL默認(rèn)的事務(wù)型引擎,也是最重要和使用最廣泛的存儲(chǔ)引擎。它被設(shè)計(jì)成為大量的短期事務(wù),短期事務(wù)大部分情況下是正常提交的,很少被回滾。InnoDB的性能與自動(dòng)崩潰恢復(fù)的特性,使得它在非事務(wù)存儲(chǔ)需求中也很流行。除非有非常特別的原因需要使用其他的存儲(chǔ)引擎,否則應(yīng)該優(yōu)先考慮InnoDB引擎。
  • MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默認(rèn)引擎。MyISAM提供的大量的特性,包括全文索引、壓縮、空間函數(shù)(GIS)等,但MyISAM并不支持事務(wù)以及行級(jí)鎖,而且一個(gè)毫無(wú)疑問(wèn)的缺陷是崩潰后無(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)。

總結(jié):

  • MyISAM管理非事務(wù)表,提供高速存儲(chǔ)和檢索以及全文搜索能力,如果再應(yīng)用中執(zhí)行大量select操作,應(yīng)該選擇MyISAM
  • InnoDB用于事務(wù)處理,具有ACID事務(wù)支持等特性,如果在應(yīng)用中執(zhí)行大量insert和update操作,應(yīng)該選擇InnoDB

到此這篇關(guān)于MySQL的存儲(chǔ)引擎InnoDB和MyISAM的文章就介紹到這了,更多相關(guān)MySQL存儲(chǔ)引擎內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql8如何設(shè)置不區(qū)分大小寫(xiě)ubuntu20

    mysql8如何設(shè)置不區(qū)分大小寫(xiě)ubuntu20

    這篇文章主要介紹了mysql8如何設(shè)置不區(qū)分大小寫(xiě)ubuntu20問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • mysql alter table命令修改表結(jié)構(gòu)實(shí)例

    mysql alter table命令修改表結(jié)構(gòu)實(shí)例

    這篇文章主要介紹了mysql alter table命令修改表結(jié)構(gòu)實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • linux/mac安裝mysql忘記密碼的解決辦法

    linux/mac安裝mysql忘記密碼的解決辦法

    這篇文章主要給大家介紹了關(guān)于linux/mac安裝mysql忘記密碼的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Mysql索引選擇以及優(yōu)化詳解

    Mysql索引選擇以及優(yōu)化詳解

    這篇文章主要給大家介紹了關(guān)于Mysql索引選擇以及優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 清空mysql 查詢緩存的可行方法

    清空mysql 查詢緩存的可行方法

    mysql對(duì)同一條sql進(jìn)行了緩存,在第二次運(yùn)行時(shí), 瞬間就完成了,若要清除緩存,可通過(guò)下面的方法來(lái)實(shí)現(xiàn)
    2014-07-07
  • MySQL DELETE語(yǔ)法使用詳細(xì)解析

    MySQL DELETE語(yǔ)法使用詳細(xì)解析

    此文章主要講述的是MySQL DELETE語(yǔ)法的詳細(xì)解析,以及一些在實(shí)際操作中值得我們大家注意的相關(guān)事項(xiàng)的描述,以下就是正文的主要內(nèi)容
    2013-03-03
  • Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫(kù)教程

    Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫(kù)教程

    大家好,本篇文章主要講的是Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫(kù)教程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 解析數(shù)據(jù)庫(kù)分頁(yè)的兩種方法對(duì)比(row_number()over()和top的對(duì)比)

    解析數(shù)據(jù)庫(kù)分頁(yè)的兩種方法對(duì)比(row_number()over()和top的對(duì)比)

    本篇文章是對(duì)數(shù)據(jù)庫(kù)分頁(yè)的兩種方法對(duì)比(row_number()over()和top的對(duì)比)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • mysql 5.7.21 解壓版通過(guò)歷史data目錄恢復(fù)數(shù)據(jù)的教程圖解

    mysql 5.7.21 解壓版通過(guò)歷史data目錄恢復(fù)數(shù)據(jù)的教程圖解

    本文通過(guò)圖文并茂的形式給大家介紹了mysql 5.7.21 解壓版,通過(guò)歷史data目錄恢復(fù)數(shù)據(jù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • MySQL子查詢用法實(shí)例分析

    MySQL子查詢用法實(shí)例分析

    這篇文章主要介紹了MySQL子查詢用法,結(jié)合實(shí)例形式對(duì)比分析了MySQL子查詢的設(shè)置技巧,需要的朋友可以參考下
    2016-04-04

最新評(píng)論