MySQL存儲引擎一般有哪3種?各自分別有什麼特色?應用場景是哪些?

MySQL5.5之後默認使用InnoDB存儲引擎,其中InnoDB和BDB提供事務安全表,其它存儲引擎都是非事務安全表。
若要修改默認引擎,能夠修改配置文件中的default-storage-engine。能夠經過:show variables like 'default_storage_engine';查看當前數據庫到默認引擎。命令:show enginesshow variables like 'have%'能夠列出當前數據庫所支持到引擎。其中Value顯示爲disabled的記錄表示數據庫支持此引擎,而在數據庫啓動時被禁用。在MySQL5.1之後,INFORMATION_SCHEMA數據庫中存在一個ENGINES的表,它提供的信息與show engines;語句徹底同樣,可使用下面語句來查詢哪些存儲引擎支持事物處理:select engine from information_chema.engines where transactions = 'yes';
能夠經過engine關鍵字在建立或修改數據庫時指定所使用到引擎。
主要存儲引擎:MyISAM、InnoDB、MEMORY和MERGE介紹:
在建立表到時候經過engine=...type=...來指定所要使用到引擎。show table status from DBname來查看指定表到引擎。sql

(一)MyISAM
  
它不支持事務,也不支持外鍵,尤爲是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT爲主的應用基本均可以使用這個引擎來建立表。
每一個MyISAM在磁盤上存儲成3個文件,其中文件名和表名都相同,可是擴展名分別爲:數據庫

  • .frm(存儲表定義)
  • MYD(MYData,存儲數據)
  • MYI(MYIndex,存儲索引)

  數據文件和索引文件能夠放置在不一樣的目錄,平均分配IO,獲取更快的速度。要指定數據文件和索引文件的路徑,須要在建立表的時候經過DATA DIRECTORY和INDEX DIRECTORY語句指定,文件路徑須要使用絕對路徑。
  每一個MyISAM表都有一個標誌,服務器或myisamchk程序在檢查MyISAM數據表時會對這個標誌進行設置。MyISAM表還有一個標誌用來代表該數據表在上次使用後是否是被正常的關閉了。若是服務器覺得當機或崩潰,這個標誌能夠用來判斷數據表是否須要檢查和修復。若是想讓這種檢查自動進行,能夠在啓動服務器時使用--myisam-recover現象。這會讓服務器在每次打開一個MyISAM數據表是自動檢查數據表的標誌並進行必要的修復處理。MyISAM類型的表可能會損壞,可使用CHECK TABLE語句來檢查MyISAM表的健康,並用REPAIR TABLE語句修復一個損壞到MyISAM表。
  MyISAM的表還支持3種不一樣的存儲格式:緩存

  • 靜態(固定長度)表
  • 動態表
  • 壓縮表

  其中靜態表是默認的存儲格式。靜態表中的字段都是非變長字段,這樣每一個記錄都是固定長度的,這種存儲方式的優勢是存儲很是迅速,容易緩存,出現故障容易恢復;缺點是佔用的空間一般比動態表多。靜態表在數據存儲時會根據列定義的寬度定義補足空格,可是在訪問的時候並不會獲得這些空格,這些空格在返回給應用以前已經去掉。同時須要注意:在某些狀況下可能須要返回字段後的空格,而使用這種格式時後面到空格會被自動處理掉。
  動態表包含變長字段,記錄不是固定長度的,這樣存儲的優勢是佔用空間較少,可是頻繁到更新刪除記錄會產生碎片,須要按期執行OPTIMIZE TABLE語句或myisamchk -r命令來改善性能,而且出現故障的時候恢復相對比較困難。
  壓縮表由myisamchk工具建立,佔據很是小的空間,由於每條記錄都是被單獨壓縮的,因此只有很是小的訪問開支。 
(二)InnoDB
  
InnoDB存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是對比MyISAM的存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。
1)自動增加列:
  
InnoDB表的自動增加列能夠手工插入,可是插入的若是是空或0,則實際插入到則是自動增加後到值。能夠經過"ALTER TABLE...AUTO_INCREMENT=n;"語句強制設置自動增加值的起始值,默認爲1,可是該強制到默認值是保存在內存中,數據庫重啓後該值將會丟失。可使用LAST_INSERT_ID()查詢當前線程最後插入記錄使用的值。若是一次插入多條記錄,那麼返回的是第一條記錄使用的自動增加值。
對於InnoDB表,自動增加列必須是索引。若是是組合索引,也必須是組合索引的第一列,可是對於MyISAM表,自動增加列能夠是組合索引的其餘列,這樣插入記錄後,自動增加列是按照組合索引到前面幾列排序後遞增的。
2)外鍵約束:
  
MySQL支持外鍵的存儲引擎只有InnoDB,在建立外鍵的時候,父表必須有對應的索引,子表在建立外鍵的時候也會自動建立對應的索引。
      在建立索引的時候,能夠指定在刪除、更新父表時,對子表進行的相應操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有關聯的狀況下,父表不能更新;casecade表示父表在更新或刪除時,更新或者刪除子表對應的記錄;set null 則表示父表在更新或者刪除的時候,子表對應的字段被set null。
  當某個表被其它表建立了外鍵參照,那麼該表對應的索引或主鍵被禁止刪除。
  可使用set foreign_key_checks=0;臨時關閉外鍵約束,set foreign_key_checks=1;打開約束。
(三)MEMORY
  
memory使用存在內存中的內容來建立表。每一個MEMORY表實際對應一個磁盤文件,格式是.frm。MEMORY類型的表訪問很是快,由於它到數據是放在內存中的,而且默認使用HASH索引,可是一旦服務器關閉,表中的數據就會丟失,但表還會繼續存在。
      默認狀況下,memory數據表使用散列索引,利用這種索引進行「相等比較」很是快,可是對「範圍比較」的速度就慢多了。所以,散列索引值適合使用在"="和"<=>"的操做符中,不適合使用在"<"或">"操做符中,也一樣不適合用在order by字句裏。若是確實要使用"<"或">"或betwen操做符,可使用btree索引來加快速度。
  存儲在MEMORY數據表裏的數據行使用的是長度不變的格式,所以加快處理速度,這意味着不能使用BLOB和TEXT這樣的長度可變的數據類型。VARCHAR是一種長度可變的類型,但由於它在MySQL內部看成長度固定不變的CHAR類型,因此可使用。安全

create table tab_memory engine=memory select  id,name,age,addr from  man order by  id;

  使用USING HASH/BTREE來指定特定到索引。服務器

create index mem_hash using  hash on  tab_memory(city_id);

  在啓動MySQL服務的時候使用--init-file選項,把insert into...select或load data infile 這樣的語句放入到這個文件中,就能夠在服務啓動時從持久穩固的數據源中裝載表。
  服務器須要足夠的內存來維持所在的在同一時間使用的MEMORY表,當再也不使用MEMORY表時,要釋放MEMORY表所佔用的內存,應該執行DELETE FROM或truncate table或者刪除整個表。
  每一個MEMORY表中放置到數據量的大小,受到max_heap_table_size系統變量的約束,這個系統變量的初始值是16M,同時在建立MEMORY表時可使用MAX_ROWS子句來指定表中的最大行數。
(四)MERGE
  
merge存儲引擎是一組MyISAM表的組合,這些MyISAM表結構必須徹底相同,MERGE表中並無數據,對MERGE類型的表能夠進行查詢、更新、刪除的操做,這些操做其實是對內部的MyISAM表進行操做。對於對MERGE表進行的插入操做,是根據INSERT_METHOD子句定義的插入的表,能夠有3個不一樣的值,first和last值使得插入操做被相應的做用在第一個或最後一個表上,不定義這個子句或者爲NO,表示不能對這個MERGE表進行插入操做。能夠對MERGE表進行drop操做,這個操做只是刪除MERGE表的定義,對內部的表沒有任何影響。MERGE在磁盤上保留2個以MERGE表名開頭文件:.frm文件存儲表的定義;.MRG文件包含組合表的信息,包括MERGE表由哪些表組成,插入數據時的依據。能夠經過修改.MRG文件來修改MERGE表,可是修改後要經過flush table刷新。工具

create  table  man_all(id int , name  varchar (20))engine=merge union =(man1,man2) insert_methos= last ;
相關文章
相關標籤/搜索