谈一谈 Memory

如果需要快速访问数据,并且这些数据不会被修改,重启以后丢失也没关系,这样的情况下使用memory表很有用。memory表至少比myisam快一个数量级,因为所有的数据都保存在内存,不需要磁盘IO,memory表的结构在重启后会保留,但是数据会丢失。


  • memory表支持哈希索引,因此查找速度极快。但是无法替代传统的基于磁盘的表,memory表使用表级锁,所以并发写入的性能较低。
  • memory表不支持blob和text类型的列。并且每行的长度是固定的。所以即使指定了varchar列,实际存储的时候也会转成char,这会导致部分内存的浪费
  • 如果MySQL在执行查询过程中需要使用临时表来存放中间结果,内部使用的临时表就是memory表。如果中间结果过大超出memory的限制,或者含有blob或者text字段,那么临时表就会转换成myisam表

适合的场景
  • 查找或者映射表
  • 缓存周期性聚合数据的结果
  • 保存数据分析中产生的中间数据

VARCHAR 和 CHAR 的区别

VARCHAR
  • 用于存储可变字符串,是最常见的字符串数据类型
  • 比char更节省空间,因为它仅使用必要的空间
  • varchar需要1或者2个额外的字节记录字符串长度,如果列的最大长度不大于255字节则只需要1字节
  • varchar不会删除末尾空格
适用场景:
  1. 字符串列的最大长度比平均长度大很多、列的更新很少、使用了utf8这种复杂字符集
  2. 每个字符都用不同的字节数存储

CHAR
  • char是定长的,根据定义的字符串长度分配足够的空间
  • char会删除末尾空格
适用场景:
  1. char适合存储很短的字符串,或者所有值都接近同一个长度。比如存储密码的md5。
  2. 对于经常变更的数据,char也比varchar更好,因为定长的char不容易产生碎片。
  3. 对于非常短的列,char在存储空间上也更有效率。例如用char来存储只有Y和N的值只需要1个字节,但是varchar需要2个字节,因为还有一个记录长度的额外字节
posted @ 2022-03-10 15:38  张三丰学Java  阅读(69)  评论(0编辑  收藏  举报