MyISAM、Memory、TokuDB 等其余存储引擎
紧接上一小节,本小节重点介绍 MyISAM、Memory、TokuDB 的特性。
1. MyISAM
在 MySQL 5.5 之前的版本,MyISAM 是默认的存储引擎。MyISAM 提供了全文索引、压缩、空间函数(GIS)等特性,但 MyISAM 不支持事务和行级锁,而且 MyISAM 没有 crash-safe 的能力。MySQL 5.6之后,MyISAM已经越来越少被使用。
Tips: crash-safe 指数据库发生故障重启,之前提交的数据不会丢失。
1.1 MyISAM特性
- 加锁与并发
MyISAM 可以对整张表加锁,而不是针对行。读数时会对表加共享锁,写入时对表加排它锁。在表有读取查询的同时,也可以对表进行插入数据。
- 延迟更新索引键
创建 MyISAM 表时,可以指定 DELAY_KEY_WRITE 选项,在每次更新完成时,不会马上将更新的索引数据写入磁盘,而是先写到内存中的键缓冲区,当清理键缓冲区或关闭表的时候,才将对应的索引块写入磁盘。这种方式可以极大地提升写入性能。
- 压缩
可以使用 myisampack 工具对 MyISAM 表进行压缩。压缩表可以极大地减少磁盘空间使用,从而减少磁盘 IO,提升查询性能。压缩表时不能进行数据的修改。表中的记录是独立压缩的,读取单行时,不需要解压整个表。
一般来说,如果数据在插入之后,不再进行修改,这种表比较适合进行压缩,如日志记录表、流水记录表。
- 修复
针对 MyISAM 表,MySQL 可以手工或自动执行检查和修复操作。执行表的修复可能会导致丢失一些数据,而且整个过程非常缓慢。
可以通过check table xxx检查表的错误,如果有错误,则通过repair table xxx进行修复。在 MySQL 服务器关闭的情况下,也可以通过 myisamchk 命令行工具进行检查和修复操作。
mysql> create table t1(
-> c1 int not null,
-> c2 varchar(10) default null
-> ) engine = myisam;
Query OK, 0 rows affected (0.06 sec)
mysql> check table t1;
+-----------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+-------+----------+----------+
| tempdb.t1 | check | status | OK |
+-----------+-------+----------+----------+
1 row in set (0.00 sec)
mysql> repair table t1;
+-----------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+--------+----------+----------+
| tempdb.t1 | repair | status | OK |
+-----------+--------+----------+----------+
1 row in set (0.00 sec)
1.2 存储方式
MyISAM 在磁盘中存储成 3 个文件,文件名和表名相同
- .frm-存储表定义 ;
- .MYD-存储数据;
- .MYI-存储索引。
下面为 MyISAM 表的创建语句,及相应的数据文件:
mysql> create table a (id int) ENGINE = MyISAM;
Query OK, 0 rows affected (0.01 sec)
[root@mysql-test-1 tempdb]# ls -lrt a.*
-rw-r----- 1 mysql mysql 8556 Apr 13 02:01 a.frm
-rw-r----- 1 mysql mysql 1024 Apr 13 02:01 a.MYI
-rw-r----- 1 mysql mysql 0 Apr 13 02:01 a.MYD
2. Memory
Memory 使用内存中的内容来创建表,每个 Memory 表只有一个 .frm 文件。如果需要快速访问数据,并且数据不会被修改,丢失也没有关系,使用 Memory 是非常适合的。而且 Memory 表支持 Hash 索引,查找操作非常快。
即便如此,Memory 表也无法取代基于磁盘的表
- Memory 表是表级锁,并发写的性能较差;
- 不支持BLOB或TEXT类型的列,并且每行的长度是固定的,即使指定了varchar列,实际存储也会使用char列。
一般来说,Memory 表比较适合以下场景:
- 用于查找或映射表,如邮编、省市区等变化不频繁的表;
- 用于缓存周期性聚合数据的表;
- 用于统计操作的中间结果表。
3. TokuDB
除了 MySQL 自带的存储引擎之外,还有一些常见的第三方存储引擎,如列式存储引擎 Infobright、高写性能和高压缩的 TokuDB。TokuDB 是一个高效写入、高压缩率、高扩展性、支持事务处理的存储引擎,最新的版本可以在 Percona Server for MySQL 中使用。
下图是官方给出的 TokuDB 与 InnoDB 的对比:
一般来说,TokuDB比较适用以下场景:
- 访问频率不高的数据或历史数据归档;
- 数据表非常大并且时不时还需要进行DDL操作。
4. 小结
本节主要学习了 MyISAM、Memory、TokuDB 这三种存储引擎。本节课程的重点如下:
- MyISAM 的特性主要包括:加锁与并发、延迟更新索引键、压缩和修复等;
- Memory 查找数据的效率非常高,但是写的性能很差;
- TokuDB 属于第三方存储引擎,拥有高写性能和高压缩的特性。