MySQL支持多種不一樣的存儲引擎,而且能夠經過插件的方式進行安裝、包括MySQL官方提供和一些第三方公司的存儲引擎,本文會介紹幾種常見的存儲引擎,介紹每種的特色等。mysql
查看默認的存儲引擎sql
SHOW VARIABLES LIKE 'default_storage_engine';
查看MySQL支持但存儲引擎數據庫
SHOW ENGINES
或緩存
SHOW VARIABLES LIKE 'have_%';
曾經MySQL的默認存儲引擎,不支持事務、不支持外鍵、支持全文索引,優點就是訪問速度比較快。工具
主要文件分爲 frm MYD MYI 三種數據類型的文件性能
.frm 中存放了表定義相關的數據,表名與文件名相同,存放在與數據庫名相同的文件夾中spa
.MYD 存放了數據文件插件
.MYI 存放了索引文件code
數據文件和索引文件能夠在建立表結構的時候經過 DATA DIRECTORY 和 INDEX DIRECTORY 來指定,例如:索引
CREATE TABLE test ( id int(11), title varchar(20) ) ENGINE = MyISAM DATA DIRECTORY = '/data/db' INDEX DIRECTORY = '/data/db';
MyISAM有可能出現表損壞,這時候須要進行表修復,可使用CHECK TABLE語句來檢查表的健康狀況,若是損壞,使用 REPAIR TABLE 語句修復一個隨壞的MyISAM表。
數據表中的數據都是非變長字段(不存在varchar之類的),這時候每一行數據都長度是固定的,這個時候數據表訪問速度很是迅速,而且容易緩存,出現故障也容易修復,缺點就是會浪費一些存儲空間。
包含變長字段的數據表就是動態表,動態表佔用的存儲空間較小,可是頻繁更新刪除會產生碎片,須要按期執行OPTIMIZE TABLE或者 myisamchk -r來改善性能。
壓縮表使用myisampack工具建立,佔用比較小的硬盤空間。訪問效率很高可是缺點就是隻讀。
InnoDB存儲在MySQL5.5之後已經做爲默認存儲引擎存在。相對MyISAM存儲引擎,InnoDB支持事務、支持外鍵。
對於AURO_INCREMENT的字段,在InnoDB表中,可使用聯合索引,可是必須做爲聯合索引的第一列,MyISAM中能夠做爲其他列,可是字段的增加會根據索引前綴的變化而增加(表現爲前綴變化才增加)。
InnoDB表支持外鍵管理,能夠給某個索引字段創建外鍵約束。
示例:
CREATE TABLE test( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(2) NOT NULL DEFAULT '', `gid` int(11) NOT NULL DEFAULT 0, KEY gid_idx(`gid`), PRIMARY KEY(id), CONSTRAINT 'gid_ref' FOREIGN KEY(`gid`) REFERENCES group(id) ON DELETE RESTRICT ON UPDATE CASECADE )
經過設置
SET FOREIGN_KEY_CHECKS = 0;
能夠忽略外鍵檢查,以此來加快處理的效率。
InnoDB支持 共享表空間和 獨立表空間兩種存儲方式,能夠經過 innodb_file_per_table 來設置存儲的方式,若是中途更改了存儲方式,更改後的設置只對更改後新建的數據表生效。
共享表空間的存儲,表結構信息存儲在.frm文件中,數據和索引保存在innodb_data_home_dir和innodb_data_file_path制定的文件中,能夠根據後者配置多個自動擴展的文件來分佈IO,可是數據和索引都混合在這個表空間中。
獨立表空間的存儲,表結構依然在.frm文件中,可是每一個數據和索引存儲在單獨的表空間中,對於分區表來講數據和索引保存在 表名稱+分區名稱.ibd文件中,而且在表分區的時候能夠分不到不一樣的IO設備中。
獨立表空間能夠很是容易的進行單表備份,可是因爲共享表空間的數據字典限制,不能夠直接經過Copy文件的方式來進行數據恢復,須要使用:
ALTER TABLE tbl_name DISCARD TABLESPACE; ALTER TABLE tbl_name IMPORT TABLESPACE;
將數據恢復到數據庫中,若是須要倒入到某個新的數據庫中,則須要使用mysqldump來實現。
純內存型存儲引擎,數據存儲在內存中,默認使用HASH索引,服務一旦重啓數據就會被清空,同時因爲存儲在內存中,因此存儲的空間大小受內存容量和max_heap_table_size的限制,同時能夠在定義數據表的時候經過MAX_ROWS來限制最大行數。
MERGE是一組MyISAM數據表的組合,只是將一組MyISAM表的數據映射到了MERGE表之中,對這個表的操做會做用在對應的MyISAM表之中。
MERGE表使用.frm存儲表定義,同時會額外使用一個.MRG文件來保存組合表的信息,修改這個文件能夠修改MERGE表,可是須要執行FLUSH TABLES來刷新。
建立數據表的時候經過 INSERT_METHOD 語句來指定插入操做做用的數據表,其中有NO、FIRST、LAST三個值能夠選擇。
MERGE表沒法智能、均勻但將數據寫道對應表中,因此通常MERGE表用於多個MyISAM表的檢索查詢。