?數(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分表)