为什么 innodb 缓冲池内存在命令 "optimize table" 后增长?
Why does innodb buffer pool memory grow after command "optimize table"?
我在带有 Mysql 容器的本地计算机上使用 docker。
步骤:
- 启动 mysql docker。使用内存约2-2.5G。
- 启动命令“优化table”。使用内存增长到 4.5-5G;
- 重新启动mysql docker并再次使用内存2-2.5G(见截图)
- 列表项;
数据库有 10 个小 table(< 10 行)和一个大 table(10,000,000 行,10 列,table 每列都有索引)。
为什么会这样?
P.S。抱歉我的英语不好。
screenshot
- 不要在 InnoDB table 上使用
OPTIMIZE TABLE
。它几乎从不提供任何好处。
OPTIMIZE TABLE
复制 table 过来。显然你有 innodb_file_per_table = OFF
,这意味着它将在 ibdata1
. 中制作 table 的第二个副本
- "An index for every column" -- 这通常是一种浪费。看看
SELECTs
你得看看你能用什么索引。 (在这里寻求帮助,但提供 SHOW CREATE TABLE
和相关查询。)
- buffer_pool 在 RAM 中;它的大小受到
innodb_buffer_pool_size
的限制。当 MySQL 开始时(例如,在您的 Docker 中),它会开始变小并逐渐变大,也许会达到那个大小。
- 执行
OPTIMIZE
,尤其是有这么多索引时,将消耗部分或全部可用 buffer_pool。
我在带有 Mysql 容器的本地计算机上使用 docker。
步骤:
- 启动 mysql docker。使用内存约2-2.5G。
- 启动命令“优化table”。使用内存增长到 4.5-5G;
- 重新启动mysql docker并再次使用内存2-2.5G(见截图)
- 列表项;
数据库有 10 个小 table(< 10 行)和一个大 table(10,000,000 行,10 列,table 每列都有索引)。
为什么会这样? P.S。抱歉我的英语不好。
screenshot
- 不要在 InnoDB table 上使用
OPTIMIZE TABLE
。它几乎从不提供任何好处。 OPTIMIZE TABLE
复制 table 过来。显然你有innodb_file_per_table = OFF
,这意味着它将在ibdata1
. 中制作 table 的第二个副本
- "An index for every column" -- 这通常是一种浪费。看看
SELECTs
你得看看你能用什么索引。 (在这里寻求帮助,但提供SHOW CREATE TABLE
和相关查询。) - buffer_pool 在 RAM 中;它的大小受到
innodb_buffer_pool_size
的限制。当 MySQL 开始时(例如,在您的 Docker 中),它会开始变小并逐渐变大,也许会达到那个大小。 - 执行
OPTIMIZE
,尤其是有这么多索引时,将消耗部分或全部可用 buffer_pool。