六、MySQL的存储引擎

核能气质少年 提交于 2019-11-30 02:32:31

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表的检索查询。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!