MySQL支持多种不同的存储引擎,并且可以通过插件的方式进行安装、包括MySQL官方提供和一些第三方公司的存储引擎,本文会介绍几种常见的存储引擎,介绍每种的特点等。
查看默认的存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';
查看MySQL支持但存储引擎
SHOW ENGINES
或
SHOW VARIABLES LIKE 'have_%';
MyISAM
曾经MySQL的默认存储引擎,不支持事务、不支持外键、支持全文索引,优势就是访问速度比较快。
存储文件
主要文件分为 frm MYD MYI 三种数据类型的文件
.frm 中存放了表定义相关的数据,表名与文件名相同,存放在与数据库名相同的文件夹中
.MYD 存放了数据文件
.MYI 存放了索引文件
数据文件和索引文件可以在创建表结构的时候通过 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表。
MyISAM的存储格式
静态表:
数据表中的数据都是非变长字段(不存在varchar之类的),这时候每一行数据都长度是固定的,这个时候数据表访问速度非常迅速,并且容易缓存,出现故障也容易修复,缺点就是会浪费一些存储空间。
动态表:
包含变长字段的数据表就是动态表,动态表占用的存储空间较小,但是频繁更新删除会产生碎片,需要定期执行OPTIMIZE TABLE或者 myisamchk -r来改善性能。
压缩表:
压缩表使用myisampack工具创建,占用比较小的硬盘空间。访问效率很高但是缺点就是只读。
InnoDB
InnoDB存储在MySQL5.5以后已经作为默认存储引擎存在。相对MyISAM存储引擎,InnoDB支持事务、支持外键。
AURO_INCREMENT
对于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来实现。
MEMORY
纯内存型存储引擎,数据存储在内存中,默认使用HASH索引,服务一旦重启数据就会被清空,同时由于存储在内存中,所以存储的空间大小受内存容量和max_heap_table_size的限制,同时可以在定义数据表的时候通过MAX_ROWS来限制最大行数。
MERGE
MERGE是一组MyISAM数据表的组合,只是将一组MyISAM表的数据映射到了MERGE表之中,对这个表的操作会作用在对应的MyISAM表之中。
存储方式
MERGE表使用.frm存储表定义,同时会额外使用一个.MRG文件来保存组合表的信息,修改这个文件可以修改MERGE表,但是需要执行FLUSH TABLES来刷新。
数据更新
创建数据表的时候通过 INSERT_METHOD 语句来指定插入操作作用的数据表,其中有NO、FIRST、LAST三个值可以选择。
MERGE表无法智能、均匀但将数据写道对应表中,所以一般MERGE表用于多个MyISAM表的检索查询。
来源:oschina
链接:https://my.oschina.net/u/226106/blog/735515