概述
- 不支持事务
- 内存读写,临时存储,重启后数据丢失,所以还是redis好
- 超高的读写效率
- 表级锁,并发性差,所以还是redis好
- Memory存储引擎默认使用哈希索引
- 不支持TEXT和BLOB列类型
- 最重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存(这个问题之前已经提到,eBay的工程师Igor Chernyshev已经给出了patch解决方案)。
- 此外有一点容易被忽视,MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集(intermediate result))。如果中间结果集大于Memory存储引擎表的容量设置,又或者中间结果含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中。之前提到MyISAM不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
应用场景
- 读多写少的静态数据,例如省市区,不过重启会丢失数据
- 当缓存使用,有个redis不具备的优点是,可以使用sql语句
- 执行排序分组时候,自动创建的系统临时表,如果中间结果超过内存表的限制,就会以myisam格式存在磁盘上
关键参数
-- 最大存储设置2gb,数据量超过会报错,修改这个值,在新的连接中才会生效
set global max_heap_table_size = 2147483648
-- 临时表最大的值,<= 最大存储,如果超过的话会以myisam存在磁盘
set global tmp_table_size = 2147483648
存储文件
在数据目录下:数据目录/数据库名称的文件夹下/
有一个文件
- 表名.frm,表的定义文件,不需要有数据文件,因为存储在了内存