概述
mysql5.5以前默認存儲引擎是MyISAM,5.5以後改成InnoDB。若要修改默認引擎,能夠修改配置文件中的default-storage-engine
。能夠經過show engines
來查看當前數據庫支持的引擎。使用select engine from information_schema.engines where transactions = 'yes';
來查看哪些引擎支持事務。在建立表到時候經過engine=...或type=...
來指定所要使用到引擎。mysql
MyISAM
它不支持事務,也不支持外鍵,其優點是訪問的速度快 ,對事務完整性沒有要求的或者以select/insert爲主的應用基本上可使用這個引擎來建立表。
每一個MyISAM在磁盤上都有3個文件,其文件名都與表名相同,但擴展名是:
.frm(表定義)
.MYD(MYDate:存儲數據)
.MYI(MYIndex:存儲索引)
.MYD文件和.MYI文件能夠放置在不一樣的目錄中,經過 data directory 和index directory語句指定。
MyISAM類型的表可能會損壞,可使用CHECK TABLE語句來檢查MyISAM表的健康,並用REPAIR TABLE語句修復一個損壞到MyISAM表。
MyISAM支持3種不一樣的存儲格式:sql
在靜態表中,若是須要保存的內容後面原本就帶有空格,那麼在返回結果的時候會去掉公共的。數據庫
在動態表中,記錄不固定,優勢是佔用空間相對比較少,缺點是頻繁的更新和刪除記錄會產生碎片,須要按期執行optimize table 來改善性能。安全
在壓縮表中,由myisampack工具建立,佔據很是小的磁盤空間。由於每一個記錄都被單獨壓縮的。服務器
InnoDB
InnoDB支持事務安全 ,對比MyISAM引擎,InnoDB寫的效率差一些,而且會佔據更多的磁盤空間。
InnoDB自動增加列能夠手工插入,可是插入的值是空或者0,則實際插入的將是自動增加後的值。可使用last_insert_id()
查詢當前線程最後插入記錄使用的值。能夠經過alert table *** auto_increment=n;
語句強制設置自動增加值。
對於InnoDB表,自動增加列必須是索引。若是是組合索引,也必須是組合索引的第一列,可是對於MyISAM表,自動增加列能夠是組合索引的其餘列,這樣插入記錄後,自動增加列是按照組合索引到前面幾列排序後遞增的。
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;
打開約束。
InnoDB存儲表和索引有以下兩種方式:
MEMORY
memory使用存在內存中的內容來建立表 。每一個MEMORY表實際對應一個磁盤文件,格式是.frm。MEMORY類型的表訪問很是快,由於它到數據是放在內存中的,而且默認使用HASH索引,可是一旦服務器關閉,表中的數據就會丟失,但表還會繼續存在。
每一個MEMORY表中放置到數據量的大小,受到max_heap_table_size系統變量的約束,這個系統變量的初始值是16M,同時在建立MEMORY表時可使用MAX_ROWS子句來指定表中的最大行數。
memory主要用於那些內容變化不頻繁的代碼表,或做爲統計操做的中間結果表。
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刷新。
merge表與分區表的區別是:merge表不會智能的將記錄寫到對應的表中,而分區表能夠的。
總結
仍一張表做爲總結:工具
mysql經常使用存儲引擎