mysql - 为什么 innodb 缓冲池内存在命令 "optimize table"之后增长?

标签 mysql optimization database-indexes

我在带有 Mysql 容器的本地机器上使用 docker。

步骤:

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

数据库有 10 个小表(< 10 行)和一个大表(10,000,000 行 10 列,表的每一列都有索引)。

为什么会这样? 附言抱歉我的英语不好。

screenshot

最佳答案

  • 不要在 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。

关于mysql - 为什么 innodb 缓冲池内存在命令 "optimize table"之后增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280975/

相关文章:

PHP MySQL 搜索组合列

C++ 限制数组引用上的限定符

c - boolean 值的轻量级矩阵

javascript - 使用纯 JavaScript 进行点分页

Cassandra 1.1 复合键/列和分层查询

php - Laravel 十进制列索引

php - 在 mysql 中存储 curl session cookie

python - 使用 MySQL.connector 和 Twisted Python 执行多个查询

mysql - Grailsquartz 插件在从 mysql 5.5 升级到 mysql 5.6 时中断

mysql - MySQL 中的唯一约束