Sunskey

日拱一卒,不期而至

0%

MySQL Memory表

MySQL Memory表

Memory的基础知识

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

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

InnoDB引擎把数据放在主键索引上,其他索引上保存的主键id。这中方式成为索引组织表。

Memory引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,我们称之为堆组织表。

InnoDB和Memory引擎的区别

1.InnoDB表的数据总是有序存放的,而内存表就是按照写入的顺序。

2.当数据文件有空洞时候,InnoDB表在插入新数据的时候,为了保证数据有序性,只能在固定的位置写入新值,而内存表找到空位就可以插入新值。

3.InnoDB 表用主键索引查询时需要走一次索引查找,用普通索引查询的时候,需要走两次。而内存表没有这个区别,索引的“地位”都是相同的。

4.数据位置发生变化的时候,InnoDB表只需要修改主键索引,而内存表需要修改所有索引。

5.InnoDB 支持变长数据类型,不同记录的长度不同;内存表不支持Blob和Text字段,并且即使定义了 varchar(N),实际也当作char(N),也就是固定长度字符串来存储,因此内存表的每行数据长度相同。

不建议在生产环境上使用内存表

  • 锁粒度问题

内存表不支持行锁,只支持表锁。跟行锁比起来对并发的支持不够好,决定了它在处理并发事务的时候,性能也不会太好。

  • 数据持久化问题

M-S模式下,slave机器重启或者升级,会导致“数据丢失”。MySQL担心主库重启后,出现主备不一致,会在binlog里面写入一行DELETE FROM t1。

双M模式下,在备库重启的时候,备库的binlog的里面delete语句会传到主库,然后把主库内存表的内存删除。