首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InnoDB表中的碎片:将所有数据一起转储在一起减小了大小,但碎片变得更糟

问InnoDB表中的碎片:将所有数据一起转储在一起减小了大小,但碎片变得更糟
EN

Database Administration用户
提问于 2018-05-09 08:16:17
回答 1查看 536关注 0票数 -1

关于MySQL中的表和碎片,我有一个问题

我的出发点是这个问题:

如何查找和修复分段MySQL表

我有一个有100万行和128 of空间的表。此表是分区的。

我将所有行转储到带有mysqldump的文件中,创建带有'__BAK‘后缀的同一个表,然后将文件中的所有数据插入到'__BAK’表中。

使用此操作,表空间将减少到112 to。好吧,我早就料到了。

但是,从上面的链接中,我检查了碎片索引(或比率)并得到了以下结果:

代码语言:javascript
复制
ENGINE TABLE_NAME     data_length   index_length  data_free   frag_ratio
InnoDB mytable        100           28             26         0,2031
InnoDB mytable__BAK   85            27             43         0,3849

在新表中,框架比(最后一列)变得更糟,据推测,所有的行都在一起。

所以,我的问题是:

  • 这是因为分区吗?我应该检查分区表中的帧比吗?
  • 也许没有必要用这么低的折边率来拆桌子,不是吗?
  • 我前面描述的步骤是否正确,可以减少碎片和/或缩小大小?
  • 如果我要选择一个选项,我应该选择哪一个?第一个表(较少的框架比,更多的空间)还是第二个表(更多的比率,更少的空间)?任何贡献或想法都是非常感谢的。非常感谢。

也许我在玩碎片化游戏。

总之,您知道(在分区表中)关于MySQL碎片的任何良好实践或建议吗?

EN

回答 1

Database Administration用户

发布于 2018-05-23 21:42:39

当涉及到额外的空间时,PARTITION是可怕的。

大多数DBA实际上并不需要分区,尽管他们认为需要分区。请为你的处境提供你的理由。我也许能说服你摆脱分区,做一些索引,然后走在前面。请提供SHOW CREATE TABLE、多少分区、哪些查询从分区中受益等。

经验法则之一是:“不要使用分区,除非您有超过100万行”。一个很大的原因是每个分区都有非平凡的“空闲”空间。更多的RoTs:http://mysql.rjweb.org/doc.php/partitionmaint

注意每个分区如何声称有4MB、5MB、6MB或7MB的“空闲”空间。(实际上,这个数字中没有包含很多碎片。)

查看这是否会给出分区详细信息(在填写数据库名称和表名之后):

代码语言:javascript
复制
       SELECT *
            FROM information_schema.PARTITIONS
            WHERE TABLE_SCHEMA = ?
              AND TABLE_NAME = ?
            ORDER BY PARTITION_ORDINAL_POSITION,
                  SUBPARTITION_ORDINAL_POSITION

对于InnoDB中的非分区表,很少有可以或应该做的事情来消除碎片。向我展示一些大表的模式;我可能还有其他建议,比如更小的数据类型或更少的索引--这将节省磁盘空间,我认为这是“真正的”问题。

还有一件事--这个表是用innodb_file_per_table = ON创建的吗?否则,您就不能将空间释放到操作系统。它将返回到“其他插入到其他表中的可用”,而不是操作系统。没有进一步的研究和讨论,不要改变这种环境。(您不想要一个大但空的ibdata1,它将所有数据放在单独的表空间中。)

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

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

复制
相关文章

相似问题

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