九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
【第0天】SQL快速入門-了解MySQL存儲(chǔ)引擎(SQL 小虛竹)

回城傳送–》《32天SQL筑基》

文章目錄

零、前言

今天是學(xué)習(xí) SQL 打卡的第 0 天,每天我會(huì)提供一篇文章供群成員閱讀( 不需要訂閱付錢 )。

希望大家先自己思考,如果實(shí)在沒有想法,再看下面的解題思路,自己再實(shí)現(xiàn)一遍。在小虛竹JAVA社區(qū) 中對應(yīng)的 【打卡貼】打卡,今天的任務(wù)就算完成了,養(yǎng)成每天學(xué)習(xí)打卡的好習(xí)慣。

? 虛竹哥會(huì)組織大家一起學(xué)習(xí)同一篇文章,所以有什么問題都可以在群里問,群里的小伙伴可以迅速地幫到你,一個(gè)人可以走得很快,一群人可以走得很遠(yuǎn),有一起學(xué)習(xí)交流的戰(zhàn)友,是多么幸運(yùn)的事情。

? 我的學(xué)習(xí)策略很簡單,題海策略+ 費(fèi)曼學(xué)習(xí)法。如果能把這些題都認(rèn)認(rèn)真真自己實(shí)現(xiàn)一遍,那意味著 SQL 已經(jīng)筑基成功了。后面的進(jìn)階學(xué)習(xí),可以繼續(xù)跟著我,一起走向架構(gòu)師之路。

今天的學(xué)習(xí)內(nèi)容是:SQL快速入門-了解MySQL存儲(chǔ)引擎

一、什么是數(shù)據(jù)庫引擎

數(shù)據(jù)庫引擎是數(shù)據(jù)庫用于存儲(chǔ)、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。

不同的數(shù)據(jù)庫引擎有其各自的特點(diǎn),如存儲(chǔ)機(jī)制、索引技巧、主鍵的處理、鎖的粒度等特點(diǎn)便隨著引擎的不同而變化。

因此,針對自己項(xiàng)目特點(diǎn)選擇合適的數(shù)據(jù)庫引擎可以改善服務(wù)器端存儲(chǔ)性能。

二、MYSQL中有哪些數(shù)據(jù)庫引擎

登錄數(shù)據(jù)庫后,執(zhí)行查詢MYSQL引擎命令:

show ENGINES;


從圖上可知,博主用的MYSQL8.0,MYSQL默認(rèn)的數(shù)據(jù)庫引擎是InnoDB。
常見的數(shù)據(jù)庫引擎有:InnoDB、MyISAM、Memoey等。下面介紹下這幾個(gè)數(shù)據(jù)庫引擎。

2.1、MyISAM

沒有提供對數(shù)據(jù)庫事務(wù)的支持,不支持細(xì)粒度的鎖(行鎖)及外鍵,當(dāng)表Insert與update時(shí)需要鎖定整個(gè)表,因此效率會(huì)低一些,在高并發(fā)時(shí)可能會(huì)遇到瓶頸,但MyIsam引擎獨(dú)立與操作系統(tǒng),可以在windows及l(fā)inux上使用。

適用于:不需要事務(wù)支持、外鍵功能、及需要對整個(gè)表加鎖的情形。
小結(jié)

  • 不支持外鍵、事物、行鎖、數(shù)據(jù)緩存。insert與update時(shí)鎖表,效率相對InnoDB較低。
  • 如果數(shù)據(jù)文件損壞,難以恢復(fù)數(shù)據(jù)。
  • 在索引存儲(chǔ)上,索引文件與數(shù)據(jù)文件分離。

2.2、Memoey

MEMORY類型的表訪問非常得快,因?yàn)樗臄?shù)據(jù)是放在內(nèi)存中的,并且默認(rèn)使用HASH索引。

但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會(huì)丟失掉。 HEAP允許只駐留在內(nèi)存里的臨時(shí)表格。駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,而且如果在關(guān)機(jī)之前沒有進(jìn)行保存,那么所有的數(shù)據(jù)都會(huì)丟失。

適用于:那些內(nèi)容變化不頻繁的代碼表,或者作為統(tǒng)計(jì)操作的中間結(jié)果表,便于高效地堆中間結(jié)果進(jìn)行分析并得到最終的統(tǒng)計(jì)結(jié)果。

小結(jié)

  • 存放在內(nèi)存中,本身就是緩存,訪問速度快,適用于內(nèi)容變化不頻繁的表,或者作為統(tǒng)計(jì)的中間結(jié)果表。
  • 不支持TEXT和BLOB數(shù)據(jù)類型,只支持固定長度的字符串類型。例如,在MEMORY存儲(chǔ)引擎中,會(huì)將VARCHAR類型自動(dòng)轉(zhuǎn)化成CHAR類型。
  • 鎖級別為表鎖,在高并發(fā)場景下會(huì)成為瓶頸。
  • 通常會(huì)被作為臨時(shí)表使用,存儲(chǔ)查詢數(shù)據(jù)時(shí)產(chǎn)生中間結(jié)果。
  • 數(shù)據(jù)存儲(chǔ)在內(nèi)存中,重啟服務(wù)器后數(shù)據(jù)會(huì)丟失。如果是需要持久化的數(shù)據(jù),不適合存儲(chǔ)在MEMORY存儲(chǔ)引擎的數(shù)據(jù)表中。

2.3、InnoDB

是一種事務(wù)型存儲(chǔ)引擎,提供了對ACID事務(wù)的支持,以及四種事務(wù)隔離級別。具備行級鎖定(適合高并發(fā),不是鎖住整張表)以及外鍵支持(只有InnoDB支持外鍵)。

適用于:處理大容量數(shù)據(jù),MySQL在運(yùn)行時(shí)InnoDB會(huì)在內(nèi)存中建立緩沖池,用于緩存數(shù)據(jù)及索引。

小結(jié)

  • 支持外鍵、事務(wù)、行鎖、數(shù)據(jù)緩存,可以處理高并發(fā)、大容量數(shù)據(jù)。
  • 能夠通過二進(jìn)制日志恢復(fù)數(shù)據(jù)。
  • 在索引存儲(chǔ)上,索引和數(shù)據(jù)存儲(chǔ)在同一個(gè)文件中,默認(rèn)按照B+Tree組織索引的結(jié)構(gòu)。同時(shí),主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)完整的數(shù)據(jù)記錄,非主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)主鍵的值。

三、MyISAM和InnoDB的區(qū)別

3.1、MYSQL版本支持默認(rèn)引擎不同

MyISAM

MySQL 5.5以前的版本默認(rèn)的存儲(chǔ)引擎是MyISAM

InnoDB

MySQL 5.5以后的版本(包含5.5)開始將InnoDB作為默認(rèn)的存儲(chǔ)引擎

3.2、數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)不同

MyISAM

每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件,它們以表的名字開頭來命名。.frm文件存儲(chǔ)表定義。.MYD(MYD)存儲(chǔ)數(shù)據(jù)文件。.MYI(MYIndex)存儲(chǔ)索引文件。

InnoDB

InnoDB在磁盤上保存為兩個(gè)文件。.frm文件存儲(chǔ)為表結(jié)構(gòu)文件,.ibd文件存儲(chǔ)的是數(shù)據(jù)和索引文件。

3.3、存儲(chǔ)空間的消耗不同

MyISAM

MyISAM支持三種不同的存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會(huì)被去掉)、動(dòng)態(tài)表、壓縮表。當(dāng)表在創(chuàng)建之后并導(dǎo)入數(shù)據(jù)之后,不會(huì)再進(jìn)行修改操作,可以使用壓縮表,極大的減少磁盤的空間占用。

InnoDB

InnoDB需要更多的內(nèi)存和存儲(chǔ),它會(huì)在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。InnoDB所在的表都保存在同一個(gè)數(shù)據(jù)文件中(也可能是多個(gè)文件,或者是獨(dú)立的表空間),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。

3.4、可移植性、備份及恢復(fù)

MyISAM

MyISAM:數(shù)據(jù)是以文件的形式存儲(chǔ),所以在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中會(huì)很方便。在備份和恢復(fù)時(shí)可單獨(dú)針對某個(gè)表進(jìn)行操作。

InnoDB

InnoDB:免費(fèi)的方案可以是拷貝數(shù)據(jù)文件、備份 binlog,或者用 mysqldump,在數(shù)據(jù)量達(dá)到幾十G的時(shí)候就相對痛苦了。

3.5、對事務(wù)的支持不同

MyISAM

MyISAM強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行速度比Innodb類型更快,但是不提供事務(wù)支持。

InnoDB

InnoDB除了提供事務(wù)支持和外部鍵等高級數(shù)據(jù)庫功能。還具有事務(wù)提交(commit)、回滾(rollback)和崩潰修復(fù)能力(crach recovery capabilities)等這些事務(wù)安全(transaction-safe ACID compliant)型表。

3.6、對鎖的支持不同

MyISAM

MyISAM支持表鎖:如果只是執(zhí)行大量的查詢, MyISAM是更好的選擇。

InnoDB

InnoDB支持行級鎖:刪除插入的時(shí)候只需要鎖定操作行就行。如果有大量的插入、修改刪除操作,使用InnoDB性能能會(huì)更高。
但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的。

3.7、表主鍵不同

MyISAM

MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。

InnoDB

InnoDB:如果沒有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。

3.8、對外鍵的支持不同

MyISAM

MyISAM不支持外鍵

InnoDB

InoDB支持外鍵

3.9、表的具體行數(shù)不同

MyISAM

保存有表的總行數(shù),如果select count() from table;會(huì)直接取出該值。

InnoDB

沒有保存表的總行數(shù),如果使用select count(*) from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。

3.10、索引結(jié)構(gòu)不同

MyISAM

MyISAM使用非聚集索引(非聚簇索引),索引和記錄分開。

InnoDB

InnoDB使用聚集索引(聚簇索引),索引和記錄在一起存儲(chǔ),既緩存索引,也緩存記錄。

3.11、并發(fā)處理能力不同

MyISAM

MyISAM使用表鎖,會(huì)導(dǎo)致寫操作并發(fā)率低,讀之間并不阻塞,讀寫阻塞。

InnoDB

InnoDB讀寫阻塞可以與隔離級別有關(guān),可以采用多版本并發(fā)控制(MVCC)來支持高并發(fā)。

擴(kuò)展:什么是MVCC-多版本并發(fā)控制

MVCC是現(xiàn)代數(shù)據(jù)庫(包括 MySQL 、Oracle 、 PostgreSQL 等)引擎實(shí)現(xiàn)中常用的處理讀寫沖突的手段, 目的在于提高數(shù)據(jù)庫高并發(fā)場景下的吞吐性能 。

客觀上,我們認(rèn)為他就是樂觀鎖的一整實(shí)現(xiàn)方式,就是每行都有版本號,保存時(shí)根據(jù)版本號決定是否成功。
innodb會(huì)為每一行添加兩個(gè)字段,分別表示該行創(chuàng)建的版本和刪除的版本,填入的是事務(wù)的版本號,這個(gè)版本號隨著事務(wù)的創(chuàng)建不斷遞增。

具體各種數(shù)據(jù)庫操作的實(shí)現(xiàn):

  • select:滿足以下兩個(gè)條件innodb會(huì)返回該行數(shù)據(jù):

    • (1)該行的創(chuàng)建版本號小于等于當(dāng)前版本號,用于保證在select操作之前所有的操作已經(jīng)執(zhí)行落地。
    • (2)該行的刪除版本號大于當(dāng)前版本或者為空。刪除版本號大于當(dāng)前版本意味著有一個(gè)并發(fā)事務(wù)將該行刪除了。
  • insert:將新插入的行的創(chuàng)建版本號設(shè)置為當(dāng)前系統(tǒng)的版本號。

  • delete:將要?jiǎng)h除的行的刪除版本號設(shè)置為當(dāng)前系統(tǒng)的版本號。

  • update:不執(zhí)行原地update,而是轉(zhuǎn)換成insert + delete。將舊行的刪除版本號設(shè)置為當(dāng)前版本號,并將新行insert同時(shí)設(shè)置創(chuàng)建版本號為當(dāng)前版本號。

  • 寫操作(insert、delete和update)執(zhí)行時(shí),需要將系統(tǒng)版本號遞增。

  • 由于舊數(shù)據(jù)并不真正的刪除,所以必須對這些數(shù)據(jù)進(jìn)行清理,innodb會(huì)開啟一個(gè)后臺(tái)線程執(zhí)行清理工作,具體的規(guī)則是將刪除版本號小于當(dāng)前系統(tǒng)版本的行刪除

四、引擎適用場景

MyISAM

  • 不需要事務(wù)支持(不支持)

  • 并發(fā)相對較低(鎖定機(jī)制問題)

  • 數(shù)據(jù)修改相對較少,以讀為主

  • 數(shù)據(jù)一致性要求不高

InnoDB

  • 需要事務(wù)支持(具有較好的事務(wù)特性)

  • 行級鎖定對高并發(fā)有很好的適應(yīng)能力

  • 數(shù)據(jù)更新較為頻繁的場景

  • 數(shù)據(jù)一致性要求較高

  • 硬件設(shè)備內(nèi)存較大,可以利用InnoDB較好的緩存能力來提高內(nèi)存利用率,減少磁盤IO

五、總結(jié)

通過本文,可迅速了解什么是存儲(chǔ)引擎,從介紹了常見的三個(gè)MySQL存儲(chǔ)引擎,著重分析了11點(diǎn)的MyISAM和InnoDB的區(qū)別,根據(jù)工作經(jīng)驗(yàn)總結(jié)建議了MyISAM和InnoDB引擎的適用場景。

六、參考

mysql官方文檔:存儲(chǔ)引擎介紹
mysql官方文檔:InnoDB存儲(chǔ)引擎介紹
技術(shù)總監(jiān)帶你剖析,MySQL儲(chǔ)存引擎,MyISAM和InnoDB的區(qū)別
mysql索引詳解:對比InnoDB與MyISAM章節(jié)
【MySQL】InnoDB和MyISAM對比(5點(diǎn)+1適用場景)

我是虛竹哥,我們明天見~

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Mysql 中 MyISAM 和 InnoDB 的區(qū)別有哪些?
數(shù)據(jù)庫常見面試題:MySQL常?的引擎及InnoDB和MySIAM的區(qū)別
myisam 索引_myisam_innodb myisam區(qū)別
MySQL索引是怎么支撐千萬級表的快速查找?
各種存儲(chǔ)引擎的特性
什么是InnoDB
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服