0

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

4

2 回答 2

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 角度看 InnoDB 单个表空间的大小
  • TBLSIZE:来自 INFORMATION_SCHEMA 数据库的 InnoDB 表的大小
  • FRGSIZE:IBDSIZE和的差TBLSIZE(以字节为单位)
  • FRAGPCTIBDSIZE:和的百分比差异TBLSIZE

如果你不喜欢多高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;

试试看 !!!

于 2013-04-23T15:42:31.150 回答
0

MySQL / InnoDB 不提供“释放”空间的功能,但它将重新使用已删除行中的空间用于将来的插入语句。

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

于 2013-04-22T09:30:23.983 回答