一桥状、MySQL常用存儲引擎及特點
1帽揪、InnoDB存儲引擎
從MySQL5.5版本之后,MySQL的默認內(nèi)置存儲引擎已經(jīng)是InnoDB了辅斟,他的主要特點有:
(1)災(zāi)難恢復(fù)性比較好转晰;
(2)支持事務(wù)。默認的事務(wù)隔離級別為可重復(fù)度士飒,通過MVCC(并發(fā)版本控制)來實現(xiàn)的查邢。
(3)使用的鎖粒度為行級鎖,可以支持更高的并發(fā)酵幕;
(4)支持外鍵侠坎;
(5)配合一些熱備工具可以支持在線熱備份;
(6)在InnoDB中存在著緩沖管理裙盾,通過緩沖池实胸,將索引和數(shù)據(jù)全部緩存起來,加快查詢的速度番官;
(7)對于InnoDB類型的表庐完,其數(shù)據(jù)的物理組織形式是聚簇表。所有的數(shù)據(jù)按照主鍵來組織徘熔。數(shù)據(jù)和索引放在一塊门躯,都位于B+數(shù)的葉子節(jié)點上;
2酷师、MyISAM存儲引擎
在5.5版本之前讶凉,MyISAM是MySQL的默認存儲引擎,該存儲引擎并發(fā)性差山孔,不支持事務(wù)懂讯,所以使用場景比較少,主要特點為:
(1)不支持事務(wù)台颠;
(2)不支持外鍵褐望,如果強行增加外鍵,不會提示錯誤,只是外鍵不其作用瘫里;
(3)對數(shù)據(jù)的查詢緩存只會緩存索引实蔽,不會像InnoDB一樣緩存數(shù)據(jù),而且是利用操作系統(tǒng)本身的緩存谨读;
(4)默認的鎖粒度為表級鎖局装,所以并發(fā)度很差,加鎖快劳殖,鎖沖突較少铐尚,所以不太容易發(fā)生死鎖;
(5)支持全文索引(MySQL5.6之后闷尿,InnoDB存儲引擎也對全文索引做了支持)塑径,但是MySQL的全文索引基本不會使用女坑,對于全文索引填具,現(xiàn)在有其他成熟的解決方案,比如:ElasticSearch匆骗,Solr劳景,Sphinx等。
(6)數(shù)據(jù)庫所在主機如果宕機碉就,MyISAM的數(shù)據(jù)文件容易損壞盟广,而且難恢復(fù);
3瓮钥、MEMORY存儲引擎
將數(shù)據(jù)存在內(nèi)存中筋量,和市場上的Redis,memcached等思想類似碉熄,為了提高數(shù)據(jù)的訪問速度桨武,主要特點:
(1)支持的數(shù)據(jù)類型有限制,比如:不支持TEXT和BLOB類型锈津,對于字符串類型的數(shù)據(jù)呀酸,只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型琼梆;
(2)支持的鎖粒度為表級鎖性誉。所以,在訪問量比較大時茎杂,表級鎖會成為MEMORY存儲引擎的瓶頸错览;
(3)由于數(shù)據(jù)是存放在內(nèi)存中,所以在服務(wù)器重啟之后煌往,所有數(shù)據(jù)都會丟失蝗砾;
(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB悼粮,TEXT類型的字段闲勺,那么這個臨時表就會轉(zhuǎn)化為MyISAM類型的表,性能會急劇降低扣猫;
4菜循、ARCHIVE存儲引擎
ARCHIVE存儲引擎適合的場景有限,由于其支持壓縮申尤,故主要是用來做日志癌幕,流水等數(shù)據(jù)的歸檔,主要特點:
(1)支持Zlib壓縮昧穿,數(shù)據(jù)在插入表之前勺远,會先被壓縮;
(2)僅支持SELECT和INSERT操作时鸵,存入的數(shù)據(jù)就只能查詢胶逢,不能做修改和刪除;
(3)只支持自增鍵上的索引饰潜,不支持其他索引初坠;
5、CSV存儲引擎
數(shù)據(jù)中轉(zhuǎn)試用彭雾,主要特點:
(1)其數(shù)據(jù)格式為.csv格式的文本碟刺,可以直接編輯保存;
(2)導(dǎo)入導(dǎo)出比較方便薯酝,可以將某個表中的數(shù)據(jù)直接導(dǎo)出為csv半沽,試用Excel辦公軟件打開;
二吴菠、InnoDB和MyISAM的對比
1者填、由于鎖粒度的不同,InnoDB比MyISAM支持更高的并發(fā)橄务;
2幔托、InnoDB為行級鎖,MyISAM為表級鎖蜂挪,所以InnoDB相對于MyISAM來說重挑,更容易發(fā)生死鎖,鎖沖突的概率更大棠涮,而且上鎖的開銷也更大谬哀,因為需要為每一行加鎖;
3严肪、在備份容災(zāi)上史煎,InnoDB支持在線熱備谦屑,有很成熟的在線熱備解決方案;
4篇梭、查詢性能上氢橙,MyISAM的查詢效率高于InnoDB,因為InnoDB在查詢過程中恬偷,是需要維護數(shù)據(jù)緩存悍手,而且查詢過程是先定位到行所在的數(shù)據(jù)塊,然后在從數(shù)據(jù)塊中定位到要查找的行袍患;而MyISAM可以直接定位到數(shù)據(jù)所在的內(nèi)存地址坦康,可以直接找到數(shù)據(jù);
5诡延、SELECT COUNT(*)語句滞欠,如果行數(shù)在千萬級別以上,MyISAM可以快速查出肆良,而InnoDB查詢的特別慢筛璧,因為MyISAM將行數(shù)單獨存儲了,而InnoDB需要朱行去統(tǒng)計行數(shù)妖滔;所以如果使用InnoDB隧哮,而且需要查詢行數(shù)桶良,則需要對行數(shù)進行特殊處理座舍,如:離線查詢并緩存;
6陨帆、MyISAM的表結(jié)構(gòu)文件包括:.frm(表結(jié)構(gòu)定義),.MYI(索引),.MYD(數(shù)據(jù))曲秉;而InnoDB的表數(shù)據(jù)文件為:.ibd和.frm(表結(jié)構(gòu)定義);
三疲牵、如何選擇合適的存儲引擎
1承二、使用場景是否需要事務(wù)支持;
2纲爸、是否需要支持高并發(fā)亥鸠,InnoDB的并發(fā)度遠高于MyISAM;
3识啦、是否需要支持外鍵负蚊;
4、是否需要支持在線熱備颓哮;
5家妆、高效緩沖數(shù)據(jù),InnoDB對數(shù)據(jù)和索引都做了緩沖冕茅,而MyISAM只緩沖了索引伤极;
6蛹找、索引,不同存儲引擎的索引并不太一樣哨坪;