數(shù)據(jù)庫引擎對比InnerDB和MYISAM

?數(shù)據(jù)庫存儲引擎,是不同的存儲技術(shù)將數(shù)據(jù)存儲在文件或者內(nèi)存當(dāng)中,這些存儲引擎當(dāng)中每種都會使用不同的技術(shù)來進行數(shù)據(jù)的存儲,索引技巧實現(xiàn)蟋字,或者說數(shù)據(jù)庫鎖的實現(xiàn),通過這些不同的技巧來最終達到一定的效果扭勉。

? ?主要來看下我們比較經(jīng)常使用的InnerDB

? ?InnerDB

? ? ? ?InnerDB是一個事務(wù)型的存儲引擎鹊奖,主要是目的是大數(shù)據(jù)時提供高性能的數(shù)據(jù)服務(wù),在運行時在內(nèi)存當(dāng)中建立緩沖池涂炎,用來緩沖數(shù)據(jù)和索引忠聚。

InnerDB的特點:

1、支持事務(wù)處理唱捣、ACID事務(wù)特性

2两蟀、實現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級別

3、支持行級鎖和外鍵約束

4震缭、可以利用事務(wù)日志進行數(shù)據(jù)恢復(fù)

5赂毯、不支持FullText類型的索引,沒有保存數(shù)據(jù)庫行數(shù)拣宰,計算count(*)需要全局掃描

6党涕、支持自動增加列屬性auto_increment

7、最后也是非常重要的一點:InnerDB是為了處理大量數(shù)據(jù)時的最大性能設(shè)計巡社,其CPU效率可能是其他基于磁盤的關(guān)系型數(shù)據(jù)庫所不能匹敵的遣鼓。

在以下兩點情況下必須使用InnerDB

1、可靠性高或者必須要求事務(wù)處理

2重贺、表更新和查詢相當(dāng)?shù)念l繁,并且表鎖定的機會比較大的情況下,指定InnerDB存儲引擎气笙。

InnerDB引擎的索引實現(xiàn):

? ?InnerDB引擎的索引結(jié)構(gòu)是B+樹的實現(xiàn)方式次企。InnerDB的索引文件存儲的包括數(shù)據(jù)文件,所以B+Tree樹當(dāng)中葉子節(jié)點中存儲的就是實際數(shù)據(jù)潜圃,其實這種索引就是聚集索引缸棵。

? ?InnerDB的輔助索引存儲域存儲的也是記錄相應(yīng)主鍵的值不是地址,所以當(dāng)使用輔助索引查找時谭期,會先通過輔助索引找到主鍵堵第,再根據(jù)主鍵索引找到實際的數(shù)據(jù)。InnerDB不建議使用過長的主鍵隧出,否則會使輔助索引變得很大踏志。

? ?因為InnerDB的數(shù)據(jù)本身要按照主鍵進行聚集,所以InnerDB必須要有主鍵胀瞪,如果沒有顯示指定针余,InnerDB會自動選擇可以唯一標(biāo)識的列作為主鍵,如果不存在這樣的列凄诞,InnerDB會隱式生成一個隱含字段圆雁,作為主鍵。

? ?InnerDB的輔助索引data域當(dāng)中存儲的值是主鍵的值而不是地址帆谍,InnerDB的輔助索引都是用主鍵作為data域伪朽。

? ?InnerDB引擎索引的查找步驟為:將主鍵組織到B+樹上,行數(shù)據(jù)存儲在B+樹的葉子節(jié)點上汛蝙,如果使用主鍵檢索烈涮,會通過主鍵檢索到葉子節(jié)點,然后獲得行數(shù)據(jù)患雇。如果對name進行檢索跃脊,會在輔助索引B+樹上檢索name,找到其葉子節(jié)點,獲得相應(yīng)的主鍵苛吱,第二步使用主鍵在B+樹當(dāng)中再執(zhí)行一次檢索酪术,最終到達葉子節(jié)點,獲取整行數(shù)據(jù)翠储。

MyISAM存儲引擎

? ? MyISAM是Mysql的默認引擎绘雁,其目標(biāo)是快速讀取。

MyISAM引擎的特點:

1援所、快速讀取庐舟,如果頻繁插入和更新的話,因為涉及到數(shù)據(jù)全表鎖住拭,效率并不高

2挪略、保存了數(shù)據(jù)庫行數(shù)历帚,執(zhí)行count時,不需要掃描全表杠娱;

3挽牢、不支持數(shù)據(jù)庫事務(wù);

4摊求、不支持行級鎖和外鍵禽拔;

5、不支持故障恢復(fù)室叉。

6睹栖、支持全文檢索FullText,壓縮索引茧痕。

MyISAM建議使用場景:

1野来、做很多count計算的,(如果count計算后面有where還是會全表掃描)

2凿渊、插入和更新較少梁只,查詢比較頻繁的

? ? ? MyISAM引擎在創(chuàng)建表的時候,會創(chuàng)建三個文件埃脏,.frm文件搪锣,存儲表的定義,.myd存儲數(shù)據(jù)庫數(shù)據(jù)彩掐,.myi存儲數(shù)據(jù)索引构舟。

? ? ?MyISAM的索引和數(shù)據(jù)是分開的,并且索引是有壓縮的堵幽,所以存儲文件就會小很多狗超,MyISAM應(yīng)對錯誤碼導(dǎo)致的數(shù)據(jù)恢復(fù)的速度很快,MyISAM數(shù)據(jù)是以文件的形式保存的朴下,所以在跨平臺當(dāng)中數(shù)據(jù)移動很方便努咐,

MyISAM索引實現(xiàn):

? ? MyISAM引擎當(dāng)中的索引也是采用B+樹的方式,MyISAM當(dāng)中節(jié)點的鍵值指向的地址殴胧,地址當(dāng)中存儲的數(shù)據(jù)

? ? B+樹當(dāng)中存儲的內(nèi)容為實際數(shù)據(jù)的地址渗稍,也就是索引和數(shù)據(jù)的存儲是分開的,即非聚集索引的一種實現(xiàn)方式团滥。MyISAM引擎中根據(jù)索引的搜查方式是竿屹,根究給定的條件基于索引查找,找到葉子節(jié)點當(dāng)中的數(shù)據(jù)地址灸姊,然后再根據(jù)數(shù)據(jù)地址查找到數(shù)據(jù)拱燃。

Mrg_MyISAM存儲引擎

? ?Mrg_MyISAM是一種水平分表的一種方式,Mrg_MyISAM是一組MyISAM引擎的組合力惯,將多個MyISAM引擎聚合起來碗誉,但是其內(nèi)部沒有數(shù)據(jù)召嘶,數(shù)據(jù)保存在MyISAM引擎對應(yīng)的數(shù)據(jù)庫當(dāng)中,但是可以直接進行查詢哮缺,刪除更新操作苍蔬。

? ?比如用戶表,我們有上億的用戶蝴蜓,這個時候,對用戶表進行水平切分俺猿,分成user1,user2茎匠,并且兩張表結(jié)構(gòu)完全相同,

//用戶表一

CREATE TABLE IF NOT EXISTS `user1` (?

`id` int(11) NOT NULL ,

`name` varchar(50) DEFAULT NULL,?

PRIMARY KEY (`id`)?

) ENGINE=MyISAM? DEFAULT CHARSET=utf8 ;?

//用戶表二

CREATE TABLE IF NOT EXISTS `user2` (?

`id` int(11) NOT NULL ,

`name` varchar(50) DEFAULT NULL,?

PRIMARY KEY (`id`)?

) ENGINE=MyISAM? DEFAULT CHARSET=utf8 ;?

//分別插入兩條測試數(shù)據(jù)先

INSERT INTO `user1` (`name`) VALUES('輔助');?

INSERT INTO `user2` (`name`) VALUES('JackFrost');

接下來我們創(chuàng)建一個Mrg_MyISAM存儲引擎的數(shù)據(jù)表

CREATE TABLE IF NOT EXISTS `alluser` (?

? `id` int(11) NOT NULL ,?

? `name` varchar(50) DEFAULT NULL,?

? PRIMARY KEY (`id`)

) ENGINE=MRG_MYISAM?

DEFAULT CHARSET=utf8

UNION=(user1,user2)? ;?

在查詢時押袍,只需要查詢主表诵冒,就可以把分表當(dāng)中的數(shù)據(jù)查詢出來,但是如果插入的時候谊惭,會提示插入失敗汽馋,只有讀權(quán)限,可以修改總表的method權(quán)限圈盔,來執(zhí)行插入操作豹芯,同時也會指定插入主表時,插入的是具體哪個分表

ALTER TABLE `test_engine`.`alluser` INSERT_METHOD = FIRST;

也可以設(shè)置成插入總表的時候驱敲,插入到最后的一個分表當(dāng)中

//就是插入總表的時候铁蹈,其實也是插入到最后一個分表。

ALTER TABLE `test_engine`.`alluser` INSERT_METHOD = LAST;

在實際開發(fā)當(dāng)中众眨,我們需要有一個Mrg_MyISAM引擎的表來保存主鍵握牧,然后我們根據(jù)路由策略來決定將數(shù)據(jù)保存到哪張表中。

Mrg_MyISAM使用場景:

1娩梨、適合插入和查詢比較高的系統(tǒng)沿腰,有MyISAM是全表鎖,所以不適合更新比較頻繁的場景狈定。

2颂龙、實際開發(fā)當(dāng)中比較適合的就是日志管理,將不同月份的日志保存在不同的表當(dāng)中掸冤,然后使用工具壓縮厘托,最后通過一張表查詢初出來。

Mrg_MyISAM使用時收到的限制:

1稿湿、主表必須使用Mrg_MyISAM引擎铅匹,子表必須使用MyISAM引擎〗忍伲可能就會有部分限制包斑,比如不支持事務(wù)和外鍵

2流礁、主表不能使用MyISAM的特性,比如全文索引罗丰,可以為子表創(chuàng)建FullText類型的索引神帅,但是查詢的話只能通過主表查詢

3、如果修改主表的存儲引擎萌抵,那么主表和子表的映射關(guān)系就丟失了找御,會將子表中的數(shù)據(jù)拷貝到修改后的表中

4、主表和字表的主鍵都不能自動增長

5绍填、子表之間不能存在唯一鍵約束霎桅,但是單個子表內(nèi)可以存在唯一鍵,所以通過主表可能查詢到重復(fù)的id

Memory存儲引擎

?Memory存儲引擎采用邏輯介質(zhì)是內(nèi)存讨永,因此其訪問速度會非程鲜唬快,其默認使用的是hash索引卿闹,一旦服務(wù)關(guān)掉揭糕,數(shù)據(jù)就會丟失。Memory存儲引擎要求存儲的數(shù)據(jù)是長度不變的格式锻霎,比如blob和text類型都不可以

適合的場景:

1著角、適合保存目標(biāo)數(shù)據(jù)比較小,并且頻繁進行訪問的量窘,如果太大的話雇寇,容易造成內(nèi)存溢出,通過max_heap_table_size來設(shè)定表的大邪鐾锨侯;

2、存儲在Memory引擎的表中的數(shù)據(jù)冬殃,如果丟失也沒有關(guān)系的

3囚痴、如果數(shù)據(jù)是臨時的,必須立刻用的到审葬,那么可以存在內(nèi)存當(dāng)中深滚。

? ?Memory存儲引擎支持hash索引和B樹索引,hash索引用來比較相等會比較快涣觉,范圍查找會比較慢痴荐,B樹索引可以部分查詢和通配查詢,也可以使用<官册,>生兆,= 等方便數(shù)據(jù)挖掘。

? Memory存儲引擎創(chuàng)建的表膝宁,最好是使用完之后鸦难,就刪除根吁。

以上就是關(guān)于常用的數(shù)據(jù)庫引擎的記錄,如有錯誤合蔽,歡迎指正~


參考:MySQL存儲引擎InnoDB和MyISAM區(qū)別及使用場景

? ? ? ? ??MySQL優(yōu)化系列(五)--數(shù)據(jù)庫存儲引擎(主要分析對比InnoDB和MyISAM以及講述Mrg_Myisam分表)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击敌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拴事,更是在濱河造成了極大的恐慌沃斤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃宵,死亡現(xiàn)場離奇詭異轰枝,居然都是意外死亡,警方通過查閱死者的電腦和手機组去,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來步淹,“玉大人从隆,你說我怎么就攤上這事$择桑” “怎么了键闺?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澈驼。 經(jīng)常有香客問我辛燥,道長,這世上最難降的妖魔是什么缝其? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任挎塌,我火速辦了婚禮,結(jié)果婚禮上内边,老公的妹妹穿的比我還像新娘榴都。我一直安慰自己,他們只是感情好漠其,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布嘴高。 她就那樣靜靜地躺著,像睡著了一般和屎。 火紅的嫁衣襯著肌膚如雪拴驮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天柴信,我揣著相機與錄音套啤,去河邊找鬼。 笑死颠印,一個胖子當(dāng)著我的面吹牛纲岭,可吹牛的內(nèi)容都是我干的抹竹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼止潮,長吁一口氣:“原來是場噩夢啊……” “哼窃判!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喇闸,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袄琳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燃乍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唆樊,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年刻蟹,在試婚紗的時候發(fā)現(xiàn)自己被綠了逗旁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡舆瘪,死狀恐怖片效,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情英古,我是刑警寧澤淀衣,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站召调,受9級特大地震影響膨桥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唠叛,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一只嚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艺沼,春花似錦介牙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剩拢,卻和暖如春线得,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徐伐。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工贯钩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓角雷,卻偏偏與公主長得像祸穷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勺三,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容