【问题标题】: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)?

【问题讨论】:

  • “导致开销”:是内存开销还是 CPU 开销?
  • 与表使用的开销(开销空间)一样。

标签: 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 曾经关闭,您将丢失表中的所有数据。如果您使用复制,也会有表截断的影响。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多