首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MySQL中对表进行碎片整理?

如何在MySQL中对表进行碎片整理?
EN

Database Administration用户
提问于 2015-09-26 10:13:23
回答 2查看 11.1K关注 0票数 3

我有一个叫县的数据库。县有一个支离破碎的表GEO。我对GEO表执行了OPTIMIZE TABLE GEO,但这返回了错误

“表不支持优化,而是重新创建+分析”。

然后我执行了ALTER TABLE GEO ENGINE='InnoDB';,然后使用了ANALYZE TABLE GEO.,但是它仍然有碎片。

最后,我放弃了它,重新创造了它。但它还是有分裂的。有人能帮帮我吗,我怎么才能把它整理一下?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2015-09-27 02:18:47

方面#1

你看到的信息没有说

表不支持优化,只需重新创建+分析即可

但这条信息说

表不支持优化,只需重新创建+分析就可以了

这意味着InnoDB存储引擎已经执行

代码语言:javascript
运行
复制
ALTER TABLE GEO ENGINE='InnoDB';
ANALYZE TABLE GEO;

没有必要再这样做了。

方面#2

碎片仍然存在是有原因的。

如果表的主键是带有auto_increment的整数,则为主键生成的所有数字都是按升序排列的。

当主键被加载到BTREE索引时,就会产生碎片。为什么?

你可能觉得这令人惊讶,但我在大约3年前写了一篇题为“在有些无序插入的情况下,innodb片段有多糟糕?”的文章的答案

在那篇文章中,我解释了AVL二叉树是如何引起高度旋转的,大约45%的时间。对于BTREE,这将表示为BTREE页面拆分。分类数据意味着什么?

  • 当按升序加载数据时,向左分裂的树页将始终是半满的。
  • 当按降序加载数据时,向右分叉的树页始终是半满的。

那半整页就是表现碎片化的东西。

这一点在我去年写的另一篇文章(为什么在mysqldump导入后MyISAM表索引(也称为MYI )的大小不匹配?)中得到了进一步的说明,其中我提到了MyISAM的同样问题。

结论

真正减少碎片的唯一方法是删除所有索引并重新创建索引。如果桌子是巨大的,这不值得你花时间。

票数 4
EN

Database Administration用户

发布于 2015-09-26 11:13:20

在最好的情况下,表不会有零个碎片。您已经完成了建议的一切,以减少其碎片。现在是讨论下一个问题的时候了。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/116255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档