如何清除MySQL中MEMORY表中的开销(Data_free)?

时间:2011-01-01 18:02:44

标签: mysql memory overhead

我在MySQL中有一个MEMORY表用于实时聊天(也许这不是最好的表类型?),并且每晚删除行以保持聊天日志的可管理性会导致表中的开销。但是,由于您无法在MEMORY表上运行OPTIMIZE,如何消除开销(Data_free中的show table status)?

1 个答案:

答案 0 :(得分:4)

  

你如何摆脱开销?

您可以使用MEMORY / HEAP存储引擎强制执行表,以通过更改它来恢复从已删除行中丢失的剩余空间,但不能更改任何内容。 e.g。

ALTER TABLE my_table ENGINE=MEMORY;

它会重写表格。使用documentation

中的引用来支持它
  

释放行使用的内存   已删除,请使用ALTER   TABLE ENGINE = MEMORY以强制表   重建。

修改

  

也许这不是最好的表类型?

在我看来,这听起来并不像MEMORY表的理想应用 - 总的来说,我认为它是一个传统引擎。一些值得思考的食物

首先,MEMORY表不能/不使用b树索引(仅限哈希索引),因此否则可能使用索引进行ORDERing或测距(即<,>操作)的查询求助于排序/手动/彻底过滤。

其次,如果你的innodb_buffer_pool足够大,Innodb表将驻留在RAM中,并且对于并发线程效果更好,因此对于大多数应用程序来说,如果不比MEMORY表更好,它通常表现得更好。

第三,也许最重要的是,如果您的MySQL被关闭,您将丢失表中的所有数据。如果您正在使用复制,也会有表截断的影响。