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语句会传到主库,然后把主库内存表的内存删除。