我有一个叫县的数据库。县有一个支离破碎的表GEO。我对GEO表执行了OPTIMIZE TABLE GEO
,但这返回了错误
“表不支持优化,而是重新创建+分析”。
然后我执行了ALTER TABLE GEO ENGINE='InnoDB';
,然后使用了ANALYZE TABLE GEO.
,但是它仍然有碎片。
最后,我放弃了它,重新创造了它。但它还是有分裂的。有人能帮帮我吗,我怎么才能把它整理一下?
发布于 2015-09-27 02:18:47
你看到的信息没有说
表不支持优化,只需重新创建+分析即可
但这条信息说
表不支持优化,只需重新创建+分析就可以了
这意味着InnoDB存储引擎已经执行
ALTER TABLE GEO ENGINE='InnoDB';
ANALYZE TABLE GEO;
没有必要再这样做了。
碎片仍然存在是有原因的。
如果表的主键是带有auto_increment的整数,则为主键生成的所有数字都是按升序排列的。
当主键被加载到BTREE索引时,就会产生碎片。为什么?
你可能觉得这令人惊讶,但我在大约3年前写了一篇题为“在有些无序插入的情况下,innodb片段有多糟糕?”的文章的答案
在那篇文章中,我解释了AVL二叉树是如何引起高度旋转的,大约45%的时间。对于BTREE,这将表示为BTREE页面拆分。分类数据意味着什么?
那半整页就是表现碎片化的东西。
这一点在我去年写的另一篇文章(为什么在mysqldump导入后MyISAM表索引(也称为MYI )的大小不匹配?)中得到了进一步的说明,其中我提到了MyISAM的同样问题。
真正减少碎片的唯一方法是删除所有索引并重新创建索引。如果桌子是巨大的,这不值得你花时间。
发布于 2015-09-26 11:13:20
在最好的情况下,表不会有零个碎片。您已经完成了建议的一切,以减少其碎片。现在是讨论下一个问题的时候了。
https://dba.stackexchange.com/questions/116255
复制相似问题