简介
Mysql创建、查询、更新和删除数据操作都依赖于存储引擎,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎获得额外的速度或者功能。
主要存储引擎
查看mysql(5.7)支持的存储引擎
通过show engines;
命令可以看到:
image
mysql支持InnoDB(Mysql5.5.5,之后默认的存储引擎),MyISAM,MRG_MYISAM,MEMORY,ARCHIVE,CSV,BLACKHOLE等存储引擎。
修改存储引擎
- 全局修改配置文件my.cnf(永久):
default-storage-engine=CSV
- 全局命令修改(临时,重启后失效):
SET default_storage_engine=CSV;
- 修改某个表:
ALTER TABLE 表名 ENGINE = CSV;
主要存储引擎对比
MYISAM
MyISAM是MySQL5.5.8之前默认储存引擎。
- 文件格式:
- 表定义:*.frm;
- 表数据文件:*.MYD;
- 表索引文件:*.MYI;
- 优点:
- 只缓存索引,占用内存少;
- 精确记录表行数,count查询速度极快;
- 锁级别为表锁,表锁优点是开销小,加锁快;
- 可被压缩,存储空间较小
- 缺点:
- 不支持事务;
- 不支持外键;
- 表锁粒度大,发生锁冲动概率较高,并发能力低;
- 宕机后,MyISAM表易损坏,灾难恢复性差
适用场景:
- 做很多count的计算;
- 并发不高;
- 极少修改,例如存储用户登录日志;
- 不需要事务的;
- 数据安全要求低。
INNODB(推荐)
INNODB是MySQL5.5.8版本开始就是默认储存引擎,适用绝大多数场景。
- 文件格式:
- 表定义:*.frm;
- 表数据、索引文件:*.ibd;
- 优点:
- 支持事务;
- 支持外键;
- 可靠性高,灾难恢复性好;
- 使用行级锁,支持mvcc,并发能力强;
- 默认RR隔离级别,提供next-key loking避免幻读;
- 缓存数据和索引,还提供变更缓冲,二次写,自适应哈希索引等高效的缓存特性;
- 缺点:
- 服务器资源开销大;
- 不记录表行数,count查询会做全表扫描;
适用场景:
- 频繁修改,并发要求高;
- 支持事务,外键;
- 数据安全要求高。
MEMORY
也叫HEAP存储引擎,数据存储在内存,如果MySQL服务重启数据会丢失,但是表结构会保存下来。
- 优点:
- 由于数据存储在内存,显著提高访问性能;
- 缺点:
- 不支持事务;
- 不支持外键;
- 表锁粒度大,发生锁冲动概率较高,并发能力低;
- 所有字段都为固定长度,不支持 BLOB 和 TEXT 等大字段
- 服务重启数据会丢失,不支持灾难恢复
适用场景:
- 小表,查询性能要求高;
- 临时表;
ARCHIVE
Archiv存储引擎,只支持insert和select操作,不支持索引,主要用于数据归档。
- 文件格式:
- 表定义:*.frm;
- 表数据文件:*.arz;
- 优点:
- 只允许插入和查询,不允许修改和删除,可以实现高并发的插入;
- 用zlib对表的数据进行压缩,相比MyISAM会更加节约磁盘IO,数据量大时,依然较好的插入性能。
- 缺点:
- 功能单一,只是提供高速的插入和压缩功能;
适用场景:日志和数据采集类应用
详细的存储引擎对比表
特点 | MYISAM | INNODB | MEMORY | ARCHIVE |
---|---|---|---|---|
存储限制 | 无 | 64TB | 有 | 无 |
事务 | √ | |||
锁机制 | 表锁 | 行锁 | 表锁 | 行锁 |
外键 | √ | |||
MVCC | √ | √ | ||
B-Tree索引 | √ | √ | √ | |
Hash索引 | √ | √ | ||
全文索引 | √ | √ | ||
集群索引 | √ | |||
数据缓存 | √ | √ | ||
索引缓存 | √ | √ | √ | |
数据压缩 | √ | √ | ||
存储空间 | 低 | 高 | N/A | 非常低 |
内存空间 | 低 | 高 | 中等 | 低 |
批量写入效率 | 高 | 低 | 高 | 非常高 |
复制 | √ | √ | √ | √ |
备份/时间点恢复 | √ | √ | √ | √ |
地理信息 | √ |
总结
绝大多数场景下,使用默认INNODB都是正确的选择。除非需要用到某些INNODB不具备的特性,并且没有其他办法可以代替,那可以考虑使用其他存储引擎。
除非万不得已,否则不建议混合使用多种存储引擎,不然可能会带来一系列复杂的问题,以及一些潜在的bug和边界问题,例如在一个事务里面同时,插入两张表A(MYISAM)、B(INNODB)数据,表A数据先插入成功,接着表B插入失败回滚,就无法保证数据一致性了。混合存储对一致性备份和服务器参数配置也带来了一些麻烦。