MyISAM、Memory、TokuDB 等其余存储引擎
紧接上一小节,本小节重点介绍 MyISAM、Memory、TokuDB 的特性。
1. MyISAM
在 MysqL 5.5 之前的版本,MyISAM 是默认的存储引擎。MyISAM 提供了全文索引、压缩、空间函数(GIS)等特性,但 MyISAM 不支持事务和行级锁,而且 MyISAM 没有 crash-safe 的能力。MysqL 5.6之后,MyISAM已经越来越少被使用。
1.1 MyISAM特性
- 加锁与并发
- 延迟更新索引键
创建 MyISAM 表时,可以指定 DELAY_KEY_WRITE 选项,在每次更新完成时,不会马上将更新的索引数据写入磁盘,而是先写到内存中的键缓冲区,当清理键缓冲区或关闭表的时候,才将对应的索引块写入磁盘。这种方式可以极大地提升写入性能。
- 压缩
可以使用 myisampack 工具对 MyISAM 表进行压缩。压缩表可以极大地减少磁盘空间使用,从而减少磁盘 IO,提升查询性能。压缩表时不能进行数据的修改。表中的记录是独立压缩的,读取单行时,不需要解压整个表。
一般来说,如果数据在插入之后,不再进行修改,这种表比较适合进行压缩,如日志记录表、流水记录表。
- 修复
可以通过check table xxx检查表的错误,如果有错误,则通过repair table xxx进行修复。在 MysqL 服务器关闭的情况下,也可以通过 myisamchk 命令行工具进行检查和修复操作。
MysqL> create table t1(
-> int not null,
-> varchar() default null
-> ) engine = myisam;
Query OK, rows affected ( sec)
MysqL> check table t1;
+-----------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+-------+----------+----------+
| tempdb.t1 | check | status | OK |
+-----------+-------+----------+----------+
row in set ( sec)
MysqL> repair table t1;
+-----------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+--------+----------+----------+
| tempdb.t1 | repair | status | OK |
+-----------+--------+----------+----------+
row in set ( sec)
1.2 存储方式
- .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 表比较适合以下场景:
- 用于查找或映射表,如邮编、省市区等变化不频繁的表;
- 用于缓存周期性聚合数据的表;
- 用于统计操作的中间结果表。
3. TokuDB
除了 MysqL 自带的存储引擎之外,还有一些常见的第三方存储引擎,如列式存储引擎 Infobright、高写性能和高压缩的 TokuDB。TokuDB 是一个高效写入、高压缩率、高扩展性、支持事务处理的存储引擎,最新的版本可以在 Percona Server for MysqL 中使用。
下图是官方给出的 TokuDB 与 InnoDB 的对比:
一般来说,TokuDB比较适用以下场景:
- 访问频率不高的数据或历史数据归档;
- 数据表非常大并且时不时还需要进行DDL操作。
4. 小结
本节主要学习了 MyISAM、Memory、TokuDB 这三种存储引擎。本节课程的重点如下: