前文索引:Mysql基礎(chǔ)-存儲引擎簡述
說明:本節(jié)將詳細介紹一下常用的Mysql存儲引擎特性
MyISAM
它不支持事務(wù)盆色,也不支持外鍵工育,但是訪問速度快腹缩,對事務(wù)完整性沒有要求或者以SELECT旨剥、INSERT為主的應(yīng)用基本都可以使用這個引擎來創(chuàng)建表。
? ??????每個MyISAM在磁盤上存儲成3個文件凡泣,其中文件名和表名都相同枉疼,但是擴展名分別為:
? ? ????????1.?.frm(存儲表定義)
? ????????? 2. .MYD(MYData,存儲數(shù)據(jù))
? ? ????????3. .MYI(MYIndex鞋拟,存儲索引)
? ??????數(shù)據(jù)文件和索引文件可以放置在不同的目錄骂维,平均分配IO,獲取更快的速度贺纲。要指定數(shù)據(jù)文件和索引文件的路徑航闺,需要在創(chuàng)建表的時候通過DATA DIRECTORY和INDEX DIRECTORY語句指定,文件路徑需要使用絕對路徑猴誊。
? ??????每個MyISAM表都有一個標(biāo)志潦刃,服務(wù)器或myisamchk程序在檢查MyISAM數(shù)據(jù)表時會對這個標(biāo)志進行設(shè)置。MyISAM表還有一個標(biāo)志用來表明該數(shù)據(jù)表在上次使用后是不是被正常的關(guān)閉了懈叹。如果服務(wù)器以為當(dāng)機或崩潰乖杠,這個標(biāo)志可以用來判斷數(shù)據(jù)表是否需要檢查和修復(fù)。如果想讓這種檢查自動進行项阴,可以在啟動服務(wù)器時使用--myisam-recover現(xiàn)象滑黔。這會讓服務(wù)器在每次打開一個MyISAM數(shù)據(jù)表是自動檢查數(shù)據(jù)表的標(biāo)志并進行必要的修復(fù)處理。MyISAM類型的表可能會損壞环揽,可以使用CHECK TABLE語句來檢查MyISAM表的健康,并用REPAIR TABLE語句修復(fù)一個損壞到MyISAM表庵佣。
? ??????MyISAM的表還支持3種不同的存儲格式:
? ??????靜態(tài)(固定長度)表:其中靜態(tài)表是默認的存儲格式歉胶。靜態(tài)表中的字段都是非變長字段,這樣每個記錄都是固定長度的巴粪,這種存儲方式的優(yōu)點是存儲非常迅速通今,容易緩存粥谬,出現(xiàn)故障容易恢復(fù);缺點是占用的空間通常比動態(tài)表多辫塌。靜態(tài)表在數(shù)據(jù)存儲時會根據(jù)列定義的寬度定義補足空格漏策,但是在訪問的時候并不會得到這些空格,這些空格在返回給應(yīng)用之前已經(jīng)去掉臼氨。同時需要注意:在某些情況下可能需要返回字段后的空格掺喻,而使用這種格式時后面到空格會被自動處理掉。
? ??????動態(tài)表:動態(tài)表包含變長字段储矩,記錄不是固定長度的感耙,這樣存儲的優(yōu)點是占用空間較少,但是頻繁到更新刪除記錄會產(chǎn)生碎片持隧,需要定期執(zhí)行OPTIMIZE TABLE語句或myisamchk -r命令來改善性能即硼,并且出現(xiàn)故障的時候恢復(fù)相對比較困難。
? ??????壓縮表:壓縮表由myisamchk工具創(chuàng)建屡拨,占據(jù)非常小的空間只酥,因為每條記錄都是被單獨壓縮的,所以只有非常小的訪問開支呀狼。
InnoDB
????????InnoDB是一個健壯的事務(wù)型存儲引擎层皱,這種存儲引擎已經(jīng)被很多互聯(lián)網(wǎng)公司使用,為用戶操作非常大的數(shù)據(jù)存儲提供了一個強大的解決方案赠潦。在以下場合下叫胖,使用InnoDB是最理想的選擇:
????1.更新密集的表。InnoDB存儲引擎特別適合處理多重并發(fā)的更新請求她奥。
????2.事務(wù)瓮增。InnoDB存儲引擎是支持事務(wù)的標(biāo)準(zhǔn)MySQL存儲引擎。
????3.自動災(zāi)難恢復(fù)哩俭。與其它存儲引擎不同绷跑,InnoDB表能夠自動從災(zāi)難中恢復(fù)。
????4.外鍵約束凡资。MySQL支持外鍵的存儲引擎只有InnoDB砸捏。
????5.支持自動增加列AUTO_INCREMENT屬性。
? ? 6.基于行級別的鎖定和多版本化隙赁,使得在執(zhí)行同時包含有檢索的組合條件查詢時垦藏,可以表現(xiàn)很好的并發(fā)性能
? ? 7.從MySQL5.6開始,InnoDB支持全文檢索和FULLTEXT索引
一般來說伞访,如果需要事務(wù)支持掂骏,并且有較高的并發(fā)讀取頻率,InnoDB是不錯的選擇厚掷。
? ??? ??注意:
? ? ? ? ? ? 1弟灼、在MySQL5.6.6之前版本级解,InnoDB存儲引擎會把表(數(shù)據(jù)、索引)集中存儲在一個共享表空間中田绑,而不是像大多數(shù)其他存儲引擎那樣為不同的表創(chuàng)建不同的文件
? ? ? ? ? ? 2勤哗、InnoDB存儲引擎會把表空間當(dāng)作一個虛擬文件系統(tǒng),他會在其中存儲和管理所有InnoDB表內(nèi)容
? ? ? ? ? ? 3掩驱、在InnoDB引擎下芒划,可以通過啟用?innodb_file_per_table系統(tǒng)變量,使用獨立表空間
MEMORY
????????使用MySQL Memory存儲引擎的出發(fā)點是速度昙篙。為得到最快的響應(yīng)時間腊状,采用的邏輯存儲介質(zhì)是系統(tǒng)內(nèi)存。雖然在內(nèi)存中存儲表數(shù)據(jù)確實會提供很高的性能苔可,但當(dāng)mysqld守護進程崩潰時缴挖,所有的Memory數(shù)據(jù)都會丟失。獲得速度的同時也帶來了一些缺陷焚辅。它要求存儲在Memory數(shù)據(jù)表里的數(shù)據(jù)使用的是長度不變的格式映屋,這意味著不能使用BLOB和TEXT這樣的長度可變的數(shù)據(jù)類型,VARCHAR是一種長度可變的類型同蜻,但因為它在MySQL內(nèi)部當(dāng)做長度固定不變的CHAR類型棚点,所以可以使用。
一般在以下幾種情況下使用Memory存儲引擎:
????????1.目標(biāo)數(shù)據(jù)較小湾蔓,而且被非常頻繁地訪問瘫析。在內(nèi)存中存放數(shù)據(jù),所以會造成內(nèi)存的使用默责,可以通過參數(shù)max_heap_table_size控制Memory表的大小贬循,設(shè)置此參數(shù),就可以限制Memory表的最大大小桃序。
????????2.如果數(shù)據(jù)是臨時的杖虾,而且要求必須立即可用,那么就可以存放在內(nèi)存表中媒熊。
????????3.存儲在Memory表中的數(shù)據(jù)如果突然丟失奇适,不會對應(yīng)用服務(wù)產(chǎn)生實質(zhì)的負面影響。
????????Memory同時支持散列索引和B樹索引芦鳍。B樹索引的優(yōu)于散列索引的是嚷往,可以使用部分查詢和通配查詢,也可以使用<怜校、>和>=等操作符方便數(shù)據(jù)挖掘间影。散列索引進行“相等比較”非常快茄茁,但是對“范圍比較”的速度就慢多了魂贬,因此散列索引值適合使用在=和<>的操作符中,不適合在<或>操作符中裙顽,也同樣不適合用在order by子句中付燥。
其他存儲引擎
? ? ? ? 1、NDB存儲引擎:是MySQL集群存儲引擎愈犹,在這個存儲引擎下键科,MySQL服務(wù)器實際上變成了一個其他進程(他們提供了對NDB表的訪問)的集群客戶端。集群節(jié)點會處理彼此間的通信漩怎,從而在內(nèi)存中實現(xiàn)對表的管理勋颖。為了實現(xiàn)數(shù)據(jù)冗余,這些表會在集群進程中復(fù)制勋锤。
? ? ? ? 2饭玲、CSV存儲引擎:在CSV存儲引擎下,存儲數(shù)據(jù)時叁执,會用逗號分隔值茄厘。對于每個表,他會在數(shù)據(jù)庫目錄里創(chuàng)建一個.csv文件谈宛,這時一種普通文本文件次哈,其中每個表占用一行。CSV存儲引擎不支持索引
? ? ? ? 3吆录、MERG存儲引擎:此存儲引擎窑滞,提供一種把多個MyISAM表合并為一個邏輯單元的手段。查詢一個megrge表時恢筝,相當(dāng)于查詢其所有的成員表哀卫。此做法的好處之一是,可以突破文件系統(tǒng)對單個MyISAM表的最大尺寸所設(shè)定的限制等