前面我们一直在讲解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非正常关闭的情况下,最新添加的数据容易丢失。
本节内容已做了解为主。