MySql5.5以前默認的引擎是MyISAM,以後默認引擎修改成InnoDB,若是須要修改默認引擎,能夠在參數文件中設置default-table-type。mysql
查看當前默認引擎sql
show variables like '%engine%';
查看當前數據庫支持的引擎數據庫
show engines;
1、MyISAM緩存
MyISAM不支持事務、不支持外鍵。有點是訪問速度快,對事務完整性沒有要求。以select、insert爲住的應用基本上均可以用這個引擎來建立表。安全
MyISAM類型的表可能會損壞,緣由多是多種多樣的。能夠經過check table語句檢查MyISAM表的健康,並用repair table 語句修復一個損壞的MyISAM表。工具
每一個MyISAM磁盤上存儲成3個文件,器中文件名和表名相同,但擴展名分別是性能
.frm(存儲表定義) .MYD(MYData,存儲數據) .MYI(MYIndex,存儲索引)
MyISAM的表還支持3種不一樣的存儲格式,分別是:測試
靜態(固定長度)表; 動態表; 壓縮表
其中靜態表是默認存儲格式。url
靜態表特色:長度固定。優勢是存儲很是迅速,容易緩存,出現故障時容易恢復;缺點是佔用的空間一般比動態表多。靜態表的數據在存儲時會按照列的寬度補充尾部空格,可是在應用訪問的時候並不會獲得這些空格,這些空格在返回給應用的實惠就已經被去掉。因此須要注意的是當數據尾部自己就存在空格的時,會致使尾部空格丟失。spa
動態表特色呢:記錄長度不固定,這樣存儲的優勢是佔用的控件相對較小,可是頻繁的更新和刪除記錄會產生碎片,須要按期執行 optimize table語句或myisamchk-r命令來改善性能。 而且在出現故障時恢復相對比較困難。
壓縮表:有myisampack工具建立,佔用很是小的磁盤空間,由於每一個記錄都是被單獨壓縮的,因此只有很是小的訪問開支。
create table myisam_char( name char(10)) engine=myisam;
2、InnoDB
mysql5.5以後的默認引擎修改成InnoDB。InnoDB存儲引擎具備提交、回滾和崩潰恢復能力的事務安全。可是相對MyISAM,InnoDB寫的處理效率差一點。而且會佔用更多的磁盤以保留數據和索引。
InnoDB的特色:
一、自動增加列(與myisam自動增加的區別)
InnoDB的自動增加可手動插入,可是插入的值若是是空或0的時候,則實際插入的值將是自動增加後的值。
能夠經過 " alter table *** auto_increment = n ;"語句強制設置自動增加的初始值。默認是從1開始,可是該強制的默認值是保存在內存中,因此該值在使用以前數據庫重新啓動,那麼這個強制值就會丟失,須要重啓數據庫後從新設置。
LAST_INSER_ID(),用來查詢當前線程最後插入記錄使用的值,若是一次插入多條記錄,那麼返回的是第一條記錄使用的自動增加的值。
InnoDB和MyISAM的auto_increment 區別:
對於InnoDB表,自動增加列必須是索引。若是是組合索引,也必須是組合索引的第一列,可是對於MyISAM表,自動增加列能夠是組合索引的其餘列,這樣插入記錄後,自動增加列是按照祝賀索引的前幾列進行排序後遞增。
例如建立一個新的MyISAM類型的表autoincre_demo,自動增加列d1做爲組合索引的第二列,對該表插入一些記錄後,能夠發現本身增加列是按照組合索引的第一列d2進行排序後遞增
create table autoincre_demo (d1 smallint not null auto_increment, d2 smallint not null, name varchar(10), index(d2,d1) ) engine=myisam; insert into autoincre_demo values(2,'2'),(3,'3'),(4,'4'),(2,'2),,(3,'3'),(4,'4');
結果:
d1 d2 name
1 2 2
1 3 3
1 4 4
2 2 2
2 3 3
2 4 4
二、外鍵約束
MySQL支持外鍵的存儲引擎之友InnoDB,在建立外鍵的實惠,要求腐敗必須有對應的索引,子表的在建立外鍵的時候也會自動建立對應的索引。
三、存儲方式
InnoDB存儲表的索引有一下兩種方式:
1、使用共享表空間存儲,這種建立的表的表結構保存在.frm文件中,數據和索引保存在innodb_data_home_dir和innodb_data_file_path定義的表中間,能夠是多個文件。 2、使用多表空間存儲,這種方式建立的表的表結構仍然保存在.frm文件中,可是每一個表的數據和索引單獨保存在.ibd中,若是是個分區表,則每一個分區對應單獨的.ibd文件,文件名是「表名+分區名」,能夠在建立分區的時候指定每一個分區的數據文件位置,以此來將表的IO均勻分佈在多個磁盤中。
要使用多表空間存儲方式,須要設置參數innodb_file_per_table,並重新啓動服務後才能夠生效,對於新建的表按照多表空間的方式建立,已有的表仍然使用共享空間存儲。若是將已有的多表空間方式修改會共享表空間的方式,則新建表會在共享表空間中建立,單已有的多表空間的表仍然保存原來的訪問方式。因此多表空間的參數設置生效後,只對新建的表生效。
主要:即使在多表空間的存儲方式下,共享表空間仍然是必須的InnoDB把內部數據字典和在線重作日誌放在這文件中。
3、memory
memory存儲引擎使用存在內存中的內存來建立表,每一個menory表只實際對應一個磁盤文件,格式是.frm。
memory的訪問速度很是快,由於它的數據是放在內存中的,並默認使用HASH索引,可是一旦服務關閉,表中的數據就會丟失掉。
給memory表建立索引的時候,能夠指定使用的是HASH索引仍是BTREE索引。
create index mem_hash using HASH on tab_memory(city_id);
4、merge
merge存儲引擎是一組MyISAM表的組合,這些MyISAM表必須結構徹底相同,merge表自己並無數據。對merge類型的表能夠進行查詢、更新、刪除操做,這些操做實際上是對內部的MyISAM表進行的。
對於memory類型表的插入操做,是經過insert_method字句定義插入的表,能夠有三個不一樣的值,使用first或last值使得插入操做被相應地做用在第一或最後一個表上。不定義這個字句或者定義爲no,表示不能對merge表執行插入操做。
能夠對merge進行drop操做,這個操做只是刪除merge的定義,對內部的表沒有任何的影響。
merge表的磁盤中保留了兩個文件,文件名以表的名字開始,一個.frm文件存儲表定義,另外一個.MRG文件包含組合表的信息,包含merge表由哪些表組成,插入新的數據時的依據。能夠經過修改.MRG文件修改merge表,可是修改後須要經過flush tables刷新,
示例:
建立三個測試表
create table payment_2018( country_id smallint, payment_date datetime, amount decimal(15,2), key idx_fk_country_id (country_id) )engine = myisam;
create table payment_2019( country_id smallint, payment_date datetime, amount decimal(15,2), key idx_fk_country_id (country_id) )engine = myisam;
create table payment_all( country_id smallint, payment_date datetime, amount decimal(15,2), index(country_id) )engine=merge union=(payment_2018,payment_2019) insert_method=last;
分別向payment_201八、payment_2019插入數據,能夠發現payment_all中的數據是payment_2018和payment_2019記錄合併的結果集。
下面對payment_all插入一條記錄,因爲insert_method=last,就會向最後一個表插入記錄。下面這條記錄會存在payment_2019以及payment_all表中。雖然這條記錄是2018年的可是也是會插入到2019的這張表中。
insert into payment_all values(3, '2018-03-31',112200);
這就是merge表和分區表的區別。merge表並不能智能的將記錄寫到對應表中。而分區表是能夠的。一般咱們使用merge表來透明的低對多個表進行查詢和更新的操做,而對這種按照時間記錄的操做日誌表則能夠透明地進行插入操做。