【mysql45讲】内存表 Memory 存储引擎

1.Memory索引的数据结构

1.1 Memory索引的默认数据结构

内存表的数据部分以数组的方式单独存放,而主键 id 索引里,存的是每个数据的位置。主键 id 是 hash 索引,可以看到索引上的 key 并不是有序的。
在这里插入图片描述

1.2 Memory和InnoDB索引的区别

1.2.1 组织结构的区别

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

1.2.2 总结它们的不同

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

1.3 内存表也支持B-Tree索引

SQL语句:
alter table t1 add index a_btree_index using btree (id);
在这里插入图片描述

2.内存表为什么快

1.Memory 引擎支持 hash 索引。
2.更重要的原因是,内存表的所有数据都保存在内存,而内存的读写速度总是比磁盘快。

3.内存表的缺点

3.1 锁粒度问题

内存表不支持行锁,只支持表锁。因此,一张表只要有更新,就会堵住其他所有在这个表上的读写操作。

3.2 数据持久性问题

数据库重启的时候,所有的内存表都会被清空。

4.什么时候使用内存表

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值