【问题标题】:How do you clear overhead (Data_free) in a MEMORY table in MySQL?如何在 MySQL 的 MEMORY 表中清除开销(Data_free)?
【发布时间】:2011-06-02 06:44:46
【问题描述】:
我在 MySQL 中有一个用于实时聊天的 MEMORY 表(也许这不是最好的表类型?),并且每晚删除行以保持聊天日志的可管理性会导致表中的开销。但是,由于您无法在 MEMORY 表上运行 OPTIMIZE,您如何摆脱开销(show table status 中的Data_free)?
【问题讨论】:
标签:
mysql
memory
overhead
【解决方案1】:
你如何摆脱开销?
您可以强制使用 MEMORY/HEAP 存储引擎的表通过 ALTER 来恢复从已删除行中丢失的剩余空间,但不更改任何内容。例如
ALTER TABLE my_table ENGINE=MEMORY;
它将重写表格。用documentation 的引用来支持这一点:
释放行使用的内存
已删除的,使用 ALTER
TABLE ENGINE=MEMORY 强制一个表
重建。
编辑
也许这不是最好的表格类型?
在我看来,这听起来不像 MEMORY 表的理想应用——总的来说,我认为它是一个遗留引擎。一些值得深思的地方
首先,MEMORY 表不能/不使用 b-tree 索引(仅限散列索引),因此原本可以使用索引进行 ORDERing 或范围(即 操作)的查询求助于手动排序/过滤/详尽的。
其次,如果您的 innodb_buffer_pool 足够大,Innodb 表将驻留在 RAM 中,并且可以更好地与并发线程一起使用,因此对于大多数应用程序而言,它的性能通常与 MEMORY 表一样好。
第三,也许最重要的是,如果您的 MySQL 曾经关闭,您将丢失表中的所有数据。如果您使用复制,也会有表截断的影响。