Memory引擎

Memory

Memory 引擎内存表的所有数据都保存在内存,而内存的读写速度总是比磁盘快;支持 hash 索引。


引擎的数据和索引是分开的。
Memory的数据组织
内存表的数据部分以数组的方式单独存放,而主键 id 索引里,存的是每个数据的位置。主键 id 是 hash 索引,可以看到索引上的 key 并不是有序的。

  • InnoDB 和 Memory 引擎的数据组织方式是不同的:

InnoDB 引擎把数据放在主键索引上,其他索引上保存的是主键 id。这种方式,我们称之为索引组织表(Index Organizied Table)。
Memory 引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,我们称之为堆组织表(Heap Organizied Table)。

  • 两个引擎的一些典型不同:

1、InnoDB 表的数据总是有序存放的,而内存表的数据就是按照写入顺序存放的;
2、当数据文件有空洞的时候,InnoDB 表在插入新数据的时候,为了保证数据有序性,只能在固定的位置写入新值,而内存表找到空位就可以插入新值;
3、数据位置发生变化的时候,InnoDB 表只需要修改主键索引,而内存表需要修改所有索引;
4、InnoDB 表用主键索引查询时需要走一次索引查找,用普通索引查询的时候,需要走两次索引查找。而内存表没有这个区别,所有索引的“地位”都是相同的。
5、InnoDB 支持变长数据类型,不同记录的长度可能不同;内存表不支持 Blob 和 Text 字段,并且即使定义了 varchar(N),实际也当作 char(N),也就是固定长度字符串来存储,因此内存表的每行数据长度相同。


* Memory 的 hash 索引和 B-Tree 索引
alter table t1 add index a_btree_index using btree (id);


  • Memory 问题

1、锁粒度问题;

内存表不支持行锁,只支持表锁。因此,一张表只要有更新,就会堵住其他所有在这个表上的读写操作。
跟行锁比起来,表锁对并发访问的支持不够好。所以,内存表的锁粒度问题,决定了它在处理并发事务的时候,性能也不会太好。
2、数据持久化问题。
数据放在内存中,是内存表的优势,但也是一个劣势。因为,数据库重启的时候,所有的内存表都会被清空。
由于 MySQL 知道重启之后,内存表的数据会丢失。所以,担心主库重启之后,出现主备不一致,MySQL 在实现上做了这样一件事儿:在数据库重启之后,往 binlog 里面写入一行 DELETE FROM t1。


内存表并不适合在生产环境上作为普通数据表使用。


内存临时表刚好可以无视内存表的两个不足,主要是下面的三个原因:

1、临时表不会被其他线程访问,没有并发性的问题;
2、临时表重启后也是需要删除的,清空数据这个问题不存在;
3、备库的临时表也不会影响主库的用户线程。

Memory 临时表效果比 InnoDB 临时表更好:

1、相比于 InnoDB 表,使用内存表不需要写磁盘,往表 temp_t 的写数据的速度更快;
2、索引 b 使用 hash 索引,查找的速度比 B-Tree 索引快;
3、临时表数据只有 2000 行,占用的内存有限。

-- InnoDB 临时表
create temporary table temp_t(id int primary key, a int, b int, index(b))engine=innodb;
insert into temp_t select * from t2 where b>=1 and b<=2000;
select * from t1 join temp_t on (t1.b=temp_t.b);

-- Memory 临时表,并且在字段 b 上创建一个 hash 索引。
create temporary table temp_t(id int primary key, a int, b int, index (b))engine=memory;
insert into temp_t select * from t2 where b>=1 and b<=2000;
select * from t1 join temp_t on (t1.b=temp_t.b);
nd b<=2000;
select * from t1 join temp_t on (t1.b=temp_t.b);
  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值