简介
Mysql创建、查询、更新和删除数据操作都依赖于存储引擎,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎获得额外的速度或者功能。
主要存储引擎
查看mysql(5.7)支持的存储引擎
通过show engines;命令可以看到:
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,数据量大时,依然较好的插入性能。
缺点:
功能单一,只是提供高速的插入和压缩功能;
适用场景:日志和数据采集类应用
详细的存储引擎对比表
特点MYISAMINNODBMEMORYARCHIVE存储限制无64TB有无
事务√
锁机制表锁行锁表锁行锁
外键√
MVCC√√
B-Tree索引√√√
Hash索引√√
全文索引√√
集群索引√
数据缓存√√
索引缓存√√√
数据压缩√√
存储空间低高N/A非常低
内存空间低高中等低
批量写入效率高低高非常高
复制√√√√
备份/时间点恢复√√√√
地理信息√
总结
绝大多数场景下,使用默认INNODB都是正确的选择。除非需要用到某些INNODB不具备的特性,并且没有其他办法可以代替,那可以考虑使用其他存储引擎。
除非万不得已,否则不建议混合使用多种存储引擎,不然可能会带来一系列复杂的问题,以及一些潜在的bug和边界问题,例如在一个事务里面同时,插入两张表A(MYISAM)、B(INNODB)数据,表A数据先插入成功,接着表B插入失败回滚,就无法保证数据一致性了。混合存储对一致性备份和服务器参数配置也带来了一些麻烦。