我在带有 Mysql 容器的本地机器上使用 docker。
步骤:
- 启动 mysql docker。使用内存约 2-2.5G。
- 启动命令“优化表”。使用内存增长到 4.5-5G;
- 重启mysql docker,再次使用内存2-2.5G(见截图)
- 列表项;
数据库有 10 个小表(< 10 行)和一个大表(10,000,000 行 10 列,表的每一列都有索引)。
为什么会这样? 附言抱歉我的英语不好。
最佳答案
- 不要在 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/