回城傳送–》《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ù)庫用于存儲(chǔ)、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。
不同的數(shù)據(jù)庫引擎有其各自的特點(diǎn),如存儲(chǔ)機(jī)制、索引技巧、主鍵的處理、鎖的粒度等特點(diǎn)便隨著引擎的不同而變化。
因此,針對自己項(xiàng)目特點(diǎn)選擇合適的數(shù)據(jù)庫引擎可以改善服務(wù)器端存儲(chǔ)性能。
登錄數(shù)據(jù)庫后,執(zhí)行查詢MYSQL引擎命令:
show ENGINES;
沒有提供對數(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é):
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é):
是一種事務(wù)型存儲(chǔ)引擎,提供了對ACID事務(wù)的支持,以及四種事務(wù)隔離級別。具備行級鎖定(適合高并發(fā),不是鎖住整張表)以及外鍵支持(只有InnoDB支持外鍵)。
適用于:處理大容量數(shù)據(jù),MySQL在運(yùn)行時(shí)InnoDB會(huì)在內(nèi)存中建立緩沖池,用于緩存數(shù)據(jù)及索引。
小結(jié):
MySQL 5.5以前的版本默認(rèn)的存儲(chǔ)引擎是MyISAM
MySQL 5.5以后的版本(包含5.5)開始將InnoDB作為默認(rèn)的存儲(chǔ)引擎
每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件,它們以表的名字開頭來命名。.frm文件存儲(chǔ)表定義。.MYD(MYD)存儲(chǔ)數(shù)據(jù)文件。.MYI(MYIndex)存儲(chǔ)索引文件。
InnoDB在磁盤上保存為兩個(gè)文件。.frm文件存儲(chǔ)為表結(jié)構(gòu)文件,.ibd文件存儲(chǔ)的是數(shù)據(jù)和索引文件。
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需要更多的內(nèi)存和存儲(chǔ),它會(huì)在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。InnoDB所在的表都保存在同一個(gè)數(shù)據(jù)文件中(也可能是多個(gè)文件,或者是獨(dú)立的表空間),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
MyISAM:數(shù)據(jù)是以文件的形式存儲(chǔ),所以在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中會(huì)很方便。在備份和恢復(fù)時(shí)可單獨(dú)針對某個(gè)表進(jìn)行操作。
InnoDB:免費(fèi)的方案可以是拷貝數(shù)據(jù)文件、備份 binlog,或者用 mysqldump,在數(shù)據(jù)量達(dá)到幾十G的時(shí)候就相對痛苦了。
MyISAM強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行速度比Innodb類型更快,但是不提供事務(wù)支持。
InnoDB除了提供事務(wù)支持和外部鍵等高級數(shù)據(jù)庫功能。還具有事務(wù)提交(commit)、回滾(rollback)和崩潰修復(fù)能力(crach recovery capabilities)等這些事務(wù)安全(transaction-safe ACID compliant)型表。
MyISAM支持表鎖:如果只是執(zhí)行大量的查詢, MyISAM是更好的選擇。
InnoDB支持行級鎖:刪除插入的時(shí)候只需要鎖定操作行就行。如果有大量的插入、修改刪除操作,使用InnoDB性能能會(huì)更高。
但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的。
MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。
MyISAM不支持外鍵
InoDB支持外鍵
保存有表的總行數(shù),如果select count() from table;會(huì)直接取出該值。
沒有保存表的總行數(shù),如果使用select count(*) from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
MyISAM使用非聚集索引(非聚簇索引),索引和記錄分開。
InnoDB使用聚集索引(聚簇索引),索引和記錄在一起存儲(chǔ),既緩存索引,也緩存記錄。
MyISAM使用表鎖,會(huì)導(dǎo)致寫操作并發(fā)率低,讀之間并不阻塞,讀寫阻塞。
InnoDB讀寫阻塞可以與隔離級別有關(guān),可以采用多版本并發(fā)控制(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ù):
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)版本的行刪除
不需要事務(wù)支持(不支持)
并發(fā)相對較低(鎖定機(jī)制問題)
數(shù)據(jù)修改相對較少,以讀為主
數(shù)據(jù)一致性要求不高
需要事務(wù)支持(具有較好的事務(wù)特性)
行級鎖定對高并發(fā)有很好的適應(yīng)能力
數(shù)據(jù)更新較為頻繁的場景
數(shù)據(jù)一致性要求較高
硬件設(shè)備內(nèi)存較大,可以利用InnoDB較好的緩存能力來提高內(nèi)存利用率,減少磁盤IO
通過本文,可迅速了解什么是存儲(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適用場景)
我是虛竹哥,我們明天見~
聯(lián)系客服