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