【问题标题】:Why does innodb buffer pool memory grow after command "optimize table"?为什么 innodb 缓冲池内存在命令“优化表”后会增长?
【发布时间】:2019-03-21 12:57:06
【问题描述】:

我在本地机器上使用 docker 和 Mysql 容器。

步骤:

  1. 启动 mysql docker。使用内存约 2-2.5G。
  2. 启动命令“优化表”。使用内存增长到 4.5-5G;
  3. 重启mysql docker,再次使用内存2-2.5G(见截图)
  4. 列表项;

数据库有 10 个小表(

为什么会这样? 附:对不起我的英语不好。

screenshot

【问题讨论】:

  • “为什么会这样?”你想要简短的回答还是长的回答?因为很可能冗长的答案将在此处进行解释。
  • 短的是。最有可能optmize table 使用 innodb 缓冲池可以更快地重建表和索引。因为理论上加载表数据或将其部分放入内存并从内存中重建页面然后做多个随机磁盘 I/O 以从磁盘获取页面并进行重建。
  • 我还以为内存中的所有表也是,因为 InnoDB Buffer Pool Data 设置为 8G。还是我发现有问题?
  • InnoDB 不会在内存中自动加载表读取 this

标签: mysql optimization database-indexes


【解决方案1】:
  • 不要在 InnoDB 表上使用OPTIMIZE TABLE。它几乎从不提供任何好处。
  • OPTIMIZE TABLE 复制表格。显然你有innodb_file_per_table = OFF,这意味着它将在ibdata1 中创建表的第二个副本。
  • “每列的索引”——这通常是一种浪费。查看SELECTs 你必须看看你可以使用哪些索引。 (在这里寻求帮助,但提供SHOW CREATE TABLE 和相关查询。)
  • buffer_pool 在 RAM 中;它的大小受innodb_buffer_pool_size 的限制。当 MySQL 启动时(例如,在您的 Docker 中),它会从小规模开始,然后逐渐增长,可能会达到这个大小。
  • 执行OPTIMIZE,尤其是在有这么多索引的情况下,会消耗部分或全部可用的buffer_pool。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多