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

Jam*_*son 5 mysql memory overhead

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

Rie*_*sio 4

如何摆脱开销?

您可以强制使用 MEMORY/HEAP 存储引擎的表通过更改但不更改任何内容来恢复已删除行丢失的剩余空间。例如

ALTER TABLE my_table ENGINE=MEMORY;

它将重写该表。用文档中的引用来支持这一点:

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

编辑

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

在我看来,这听起来不像是 MEMORY 表的理想应用——总的来说,我认为它是一个遗留引擎。一些值得思考的东西

首先,MEMORY 表不能/不使用 b 树索引(仅哈希索引),因此本来可以使用索引进行 ORDERing 或范围(即 <、> 操作)的查询只能手动/彻底地进行排序/过滤。

其次,如果你的 innodb_buffer_pool 足够大,Innodb 表将驻留在 RAM 中,并且在并发线程下工作得更好,因此对于大多数应用程序来说,它的性能通常与 MEMORY 表一样好,甚至更好。

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