use*_*788 10 mysql innodb optimization
我一直在研究如何仅优化 MySQL 中的碎片表,并查看了有关优化表的这篇文章。它基本上对包含任何表的 information_schema 数据库执行查询,data_free > 0
并OPTIMIZE
仅针对这些表构建 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 碎片化”有不止一种含义:
.ibd
文件碎片化,非常大,而数据集很小请考虑一下我不久前写的这篇文章:它显示了从一个大表中清除了许多行后,数据文件是如何碎片化的(即它在文件系统中非常大——这是一个已知问题,这些文件的大小永远不会减少)。然而,在删除结束时索引并没有碎片化:这是因为 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%。当然,如果能恢复磁盘空间会很棒。
底线:只考虑非常大的表的这些问题;仅当您遇到磁盘空间问题时。
归档时间: |
|
查看次数: |
22890 次 |
最近记录: |