什么是存储引擎?
与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。MySQL数据库在实际的工作中其实分为了语句分析层和存储引擎层,其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL语句的内容和功能,而存储引擎层则主要负责接收来自语句分析层的分析结果,完成相应的数据输入输出和文件操作。简而言之,就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
MySQL存储引擎种类
说明 | |
存储引擎 说明
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务
InnoDB 5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢
ISAM MyISAM的前身,MySQL5.0以后不再默认安装
MRG_MyISAM(MERGE) 将多个表联合成一个表使用,在超大规模数据存储时很有用
Memory 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失
Falcon 一种新的存储引擎,支持事物处理,传言可能是InnoDB的替代者
Archive 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作
CSV CSV 存储引擎是基于 CSV 格式文件存储数据(应用于跨平台的数据交换)
接下来我们就介绍两种在实际开发中使用最多的两种引擎【MyISAM】和【InnoDB】。
MyISAM 引擎
这种引擎是MySQL最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:
静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。
动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。
压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。
当然不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:
选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。
MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名。 例如我创建了一个【test】表,那么就会生成以下三个文件:
文件名 | 说明 |
---|---|
test.frm | 存储表定义 |
test.MYD | 存储数据 |
test.MYI |
存储索引 |
存储引擎 说明
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务
InnoDB 5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢
ISAM MyISAM的前身,MySQL5.0以后不再默认安装
MRG_MyISAM(MERGE) 将多个表联合成一个表使用,在超大规模数据存储时很有用
Memory 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失
Falcon 一种新的存储引擎,支持事物处理,传言可能是InnoDB的替代者
Archive 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作
CSV CSV 存储引擎是基于 CSV 格式文件存储数据(应用于跨平台的数据交换)
查看存储引擎
想要查看我们的数据表使用了什么存储引擎,我们就需要使用到我们以前已经介绍过的【show】命令,语法如下:
SHOW CREATE TABLE 表名;
例如我们查看我们之前创建好的【user】表:
SHOW CREATE TABLE user; +——-+—————————————————————————————————————————————————————————————————————————-+ | Table | Create Table | +——-+—————————————————————————————————————————————————————————————————————————-+ | user | CREATE TABLE user ( userId char(5) CHARACTER SET latin1 NOT NULL, name varchar(30) DEFAULT NULL, sex char(1) CHARACTER SET latin1 DEFAULT ‘0’, PRIMARY KEY (userId) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | +——-+—————————————————————————————————————————————————————————————————————————-+
1 row in set (0.02 sec)
就可以看到【 ENGINE】显示我们使用的引擎为【MyISAM】
存储引擎的变更
变更我们存储表的存储引擎将使用到的是我们前面使用过的【ALTER】命令,语法如下:
ALTER TABLE 表名 ENGINE=新引擎;
例如,我们将【user】表的引擎更改为【InnoDB】:
mysql> ALTER TABLE user ENGINE = InnoDB; Query OK, 7 rows affected (0.50 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE user; +——-+—————————————————————————————————————————————————————————————————————————-+ | Table | Create Table | +——-+—————————————————————————————————————————————————————————————————————————-+ | user | CREATE TABLE user ( userId char(5) CHARACTER SET latin1 NOT NULL, name varchar(30) DEFAULT NULL, sex char(1) CHARACTER SET latin1 DEFAULT ‘0’, PRIMARY KEY (userId) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +——-+—————————————————————————————————————————————————————————————————————————-+ 1 row in set (0.00 sec)
我们就成功的将【user】表的存储引擎改为了【InnoDB】
修改默认引擎
要使用事务功能,就必须将表设置为InnoDB引擎,有的版本在安装时,是未激活InnoDB引擎的,所以需要我们手动进行激活。首先我们进入MySQL的安装目录,找到my.ini文件。例如,博主使用的是WampServer的集成开发环境,目录如下:
我们右键选择记事本打开后,找到【default-storage-engine】这一行,如图:
将其修改为【default-storage-engine=InnoDB】即可,我们就成功的将默认的引擎修改为【InnoDB】。