带有许多删除和插入的Innodb表 - 是否有浪费的磁盘空间?

时间:2013-04-22 09:23:15

标签: mysql database innodb

我有一个很大的(500GB)innodb表,我正在执行许多插入以及删除。 innodb_file_per_table在我的var配置中设置。我知道它可能包含很多“浪费”的磁盘空间,由于innodb的性质,问题是预期多少以及是否有办法在我的特定表中找出该数字。根据我的理解,它会重新使用delete期间创建的未使用空间,所以如果我继续inserts,我在执行re-claim procedure时不会遇到任何重大差异?作为一个拇指规则,磁盘空间浪费的上下限是什么以及使用模式定义了什么?

2 个答案:

答案 0 :(得分:2)

如果你启用了innodb_file_per_table,我有一些好消息。除了整理表格之外,你还可以做更多的事情。你可以缩小表格。为了找出您将要回收多少空间,请遵循以下步骤:

对于这些步骤,我们使用InnoDB表mydb.mytable

GIVEN_DB=mydb
GIVEN_TB=mytable
MYSQL_CONN="-root -p...."
SQLSTMT="SELECT data_length+index_length FROM information_schema.tables WHERE"
SQLSTMT="${SQLSTMT} table_schema='${GIVEN_DB}' AND table_name='${GIVEN_TB}'"
IBDSIZE=`ls -l /var/lib/mysql/${GIVEN_DB}/${GIVEN_TB}.ibd | awk '{print $5}'`
TBLSIZE=`mysql ${MYSQL_CONN} --skip-column-names -Ae"${SQLSTMT}"`
(( FRGSIZE = IBDSIZE - TBLSIZE ))
FRAGPCT=`echo ${FRGSIZE}00/${IBDSIZE}|bc`
echo ${IBDSIZE} ${TBLSIZE} ${FRGSIZE} ${FRAGPCT}

这将打印4个数字

  • IBDSIZE:来自OS Viewpoint的InnoDB单个表空间的大小
  • TBLSIZE:来自INFORMATION_SCHEMA数据库的InnoDB表的大小
  • FRGSIZEIBDSIZETBLSIZE的差异(以字节为单位)
  • FRAGPCTIBDSIZETBLSIZE
  • 的百分比差异

如果您不喜欢FRAGPCT的高度,有三种方法可以缩小mydb.mytable

选项1:OPTIMIZE TABLE mydb.mytable;

选项2:ALTER TABLE mydb.mytable ENGINE=InnoDB;

选项3:运行阶段压缩

CREATE TABLE mydb.mytabletmp LIKE mydb.mytable;
INSERT INTO mydb.mytabletmp SELECT * FROM mydb.mytable;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytabletmp RENAME mydb.mytable;

试一试!!!

答案 1 :(得分:0)

MySQL / InnoDB没有提供任何功能来释放'空间,但它将重新使用已删除行中的空格以用于将来的插入语句。

定期运行OPTIMIZE TABLEmore information)将有助于最大化您可以重复使用的数量以及提高I / O性能(它基本上就像您的数据库的碎片整理)。