我在MySQL中有一个MEMORY表用于实时聊天(也许这不是最好的表类型?),并且每晚删除行以保持聊天日志的可管理性会导致表中的开销。但是,由于您无法在MEMORY表上运行OPTIMIZE,如何消除开销(Data_free
中的show table status
)?
答案 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被关闭,您将丢失表中的所有数据。如果您正在使用复制,也会有表截断的影响。