我在 MySQL 中有一个用于实时聊天的 MEMORY 表(也许这不是最好的表类型?),并且每晚删除行以保持聊天日志的可管理性会导致表中的开销。但是,由于您无法在 MEMORY 表上运行 OPTIMIZE,您如何摆脱开销(Data_free
在 中show table status
)?
4397 次
1 回答
4
你如何摆脱开销?
您可以强制使用 MEMORY/HEAP 存储引擎的表通过 ALTER 来恢复从已删除行中丢失的剩余空间,但不更改任何内容。例如
ALTER TABLE my_table ENGINE=MEMORY;
它将重新写入表。用文档中的引用来支持它:
要释放已删除的行使用的内存,请使用 ALTER TABLE ENGINE=MEMORY 强制重建表。
编辑
也许这不是最好的表格类型?
在我看来,这听起来不像是 MEMORY 表的理想应用——总的来说,我认为它是一个遗留引擎。一些值得深思的食物
首先,MEMORY 表不能/不使用 b-tree 索引(仅限哈希索引),因此本来可以使用索引进行 ORDERing 或范围(即 <, > 操作)的查询诉诸于手动/详尽的排序/过滤。
其次,如果您的 innodb_buffer_pool 足够大,Innodb 表将驻留在 RAM 中,并且与并发线程一起工作得更好,因此对于大多数应用程序来说,它的性能通常与 MEMORY 表一样好。
第三,也许最重要的是,如果您的 MySQL 曾经关闭,您将丢失表中的所有数据。如果您使用复制,也会有表截断的影响。
于 2011-01-01T20:17:55.320 回答