如何优化 MySQL 中的 InnoDB 表

use*_*788 10 mysql innodb optimization

我一直在研究如何仅优化 MySQL 中的碎片表,并查看了有关优化表的这篇文章。它基本上对包含任何表的 information_schema 数据库执行查询,data_free > 0OPTIMIZE仅针对这些表构建 SQL 语句。我运行了这个查询,它确定了 148 个用于优化的表。所有标识的表都是 InnoDB 表。执行结果优化 SQL 脚本后,我重新运行原始脚本以识别碎片表,并在第一遍返回完全相同的表。

我看到过关于 InnoDB 表和OPTIMIZE命令的相互冲突的帖子。有人说这OPTIMIZE不适用于 InnoDB 表,您需要运行ALTER TABLE table_name ENGINE=INNODB. 其他人说在对 InnoDB 表执行时OPTIMIZE实际上调用了ALTER TABLE命令。考虑到这一点,我ALTER TABLE对标识为碎片化的 InnoDB 表之一运行了该命令 ( data_free > 0),并发现该表data_free之后没有更改。它仍然大于0。我也重新启动了MySQL并检查了它只是发现相同的结果。

现在,我们的组织中有几台运行 MySQL 5.5.29 的服务器,我对所有服务器进行了查询以识别任何 InnoDB 表,DATA_FREE=0 or NULL但没有返回。它们都大于零。

我还OPTIMIZE针对几个大于零的MyISAM表运行了该命令,DATA_FREE然后验证它是否为零。

任何人都可以为我解释一下吗?从 InnoDB 表中删除碎片的正确方法是什么?确定碎片化 InnoDB 表的正确方法是什么?

谢谢

Shl*_*ach 10

我假设你正在使用innodb_file_per_table这个答案。

“InnoDB 碎片化”有不止一种含义:

  1. .ibd 文件碎片化,非常大,而数据集很小
  2. 索引页面是碎片化的,因为页面太多而无法包含很少的数据,在这种情况下它们可以被合并。

请考虑一下我不久前写的这篇文章:它显示了从一个大表中清除了许多行后,数据文件是如何碎片化的(即它在文件系统中非常大——这是一个已知问题,这些文件的大小永远不会减少)。然而,在删除结束时索引并没有碎片化:这是因为 InnoDB 在页面变空时正确地合并页面(呃)。

OPTIMIZE命令确实不适用于 InnoDB。它所做的是重建表(就像一个ALTER)。看到这个:

mysql [localhost] {msandbox} (test) > create table t(id int) engine=innodb;

mysql [localhost] {msandbox} (test) > optimize table t;
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.t | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.t | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

至于DATA_FREE:我建议你直接忽略这个变量。老实说,我多年来一直在使用 InnoDB 表10,但从未发现这个值与任何东西都非常一致。

现在是真正讨论的时候了:你到底想达到什么目的?除非您的数据库完全陈旧,否则总会有一些碎片。在表中添加、删除和更新行的过程很自然。

碎片并不是那么邪恶:可用空间可以被新数据回收。如果你的桌子不是很大,那就忘掉整个事情吧。对于非常大的表,您可能会通过优化表来获得一些磁盘空间。但问问你自己:表多久会达到相同的碎片?一小时?一天?一周?恕我直言,在所有这些情况下,优化表格毫无意义。

尽管如此,如果一个大表被大量清除数据,预计不会返回,我完全赞成对其进行优化。假设您意识到您有一些冗余数据,这些数据约占表大小的 30%。当然,如果能恢复磁盘空间会很棒。

底线:只考虑非常大的表的这些问题;仅当您遇到磁盘空间问题时。