关于MySQL中的表和碎片,我有一个问题
我的出发点是这个问题:
我有一个有100万行和128 of空间的表。此表是分区的。
我将所有行转储到带有mysqldump的文件中,创建带有'__BAK‘后缀的同一个表,然后将文件中的所有数据插入到'__BAK’表中。
使用此操作,表空间将减少到112 to。好吧,我早就料到了。
但是,从上面的链接中,我检查了碎片索引(或比率)并得到了以下结果:
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碎片的任何良好实践或建议吗?
发布于 2018-05-23 21:42:39
当涉及到额外的空间时,PARTITION是可怕的。
大多数DBA实际上并不需要分区,尽管他们认为需要分区。请为你的处境提供你的理由。我也许能说服你摆脱分区,做一些索引,然后走在前面。请提供SHOW CREATE TABLE、多少分区、哪些查询从分区中受益等。
经验法则之一是:“不要使用分区,除非您有超过100万行”。一个很大的原因是每个分区都有非平凡的“空闲”空间。更多的RoTs:http://mysql.rjweb.org/doc.php/partitionmaint
注意每个分区如何声称有4MB、5MB、6MB或7MB的“空闲”空间。(实际上,这个数字中没有包含很多碎片。)
查看这是否会给出分区详细信息(在填写数据库名称和表名之后):
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,它将所有数据放在单独的表空间中。)
https://dba.stackexchange.com/questions/206222
复制相似问题