第十章:第12节 MySQL进阶篇——Memory存储引擎和Archive存储引擎

更新于:2023-11-01 15:50:35


前面我们一直在讲解InnoDB和MyISAM这两种存储引擎,因为这两种存储引擎是最常用的,所以我们需要搞懂它俩。MySQL除了InnoDB和MyISAM这两种存储引擎,还有几个其他的,只是不常用而已,在某些情景下这些存储引擎还是有各自的优点的。


说两个:


Memory存储引擎


顾名思义,此表的数据只存于内存中,存取数据非常快。但一旦MySQL服务关闭,这些数据就会丢失,也就是数据不能永久保存。它只能用来存储一些临时数据,可以把缓存数据放入Memory引擎的表里


值得一说的是,Memory支持哈希索引(MyISAM、InnoDB是不支持的)。前面我们学过哈希表,知道哈希表查找数据非常得快。所以,如果Memory表查找数据能用到哈希索引,那速度也是非常快。


既然哈希索引这么快,为什么InnoDB和MyISAM这两种存储引擎还用B+Tree数据结构做索引呢?


哈希索引它有自己的优缺点的:


Hash索引优点:
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B+Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B+Tree 索引。

 
Hash索引缺点:

那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;


因为InnoDB和MyISAM这两种存储引擎目前都不支持hash索引,我们也就不过多研究它了。


Archive存储引擎


1)这种类型只支持select 和 insert语句(支持行级锁和缓冲区,可以实现高并发的插入),


2)不允许修改和删除,包括使用truncate语句。


2)不支持索引,包括主键id。


Archive非常适合存储归档数据,如【web访问日志】、【系统出错日志】、【短信发送情况反馈日志】等只用于管理员查看排错,非参与业务逻辑的日志存储,都可以使用Archive。


Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。当数据量非常大的时候Archive的插入性能表现会较MyISAM为佳。


Archive表的性能是否可能超过MyISAM?答案是肯定的。根据MySQL工程师的资料,当表内的数据达到1.5GB这个量级,CPU又比较快的时候,Archive表的执行性能就会超越MyISAM表。因为这个时候,CPU会取代I/O子系统成为性能瓶颈。别忘了Archive表比其他任何类型的表执行的物理I/O操作都要少。


archive表需要注意的部分:


例如:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `version` varchar(25) DEFAULT NULL COMMENT '版本号',
    PRIMARY KEY (`id`)
) ENGINE=ARCHIVE AUTO_INCREMENT=5365 DEFAULT CHARSET=utf8 COMMENT='用户登录记录';

INSERT INTO `test` VALUES (1,'0.9.8'),(2,'1.9.2');


这样的SQL语句会报错:


ERROR 1022 (23000) at line 58: Can't write; duplicate key in table 'test'


也就是说archive表不适合导出为SQL文件做备份用,遇到这样的问题解决方法有:


1)删除主键定义,或者删除主键的自增属性;

2)修改id列的主键索引为唯一索引或者普通索引;

3)调整表DDL定义时指定的AUTO_INCREMENT值为0或1【把AUTO_INCREMENT=5365去掉】;

4)修改表引擎为InnoDB或MyISAM;


总结下:


MySQL自带的可以把数据存到内存中的Memory存储引擎用的不多,像后面我们会学到memcache、redis这些第三方内存缓存数据库,都可以作为MySQL Memory表的替代品。


Archive用途窄,只适合做少量非参与业务逻辑的日志存储。而且楠神有发现:archive在MySQL非正常关闭的情况下,最新添加的数据容易丢失


本节内容已做了解为主。