我有一个很大的(500GB)innodb表,我正在执行许多插入以及删除。
innodb_file_per_table在我的var配置中设置。我知道它可能包含很多“浪费”的磁盘空间,由于innodb的性质,问题是预期多少以及是否有办法在我的特定表中找出该数字。根据我的理解,它会重新使用delete
期间创建的未使用空间,所以如果我继续inserts
,我在执行re-claim procedure时不会遇到任何重大差异?作为一个拇指规则,磁盘空间浪费的上下限是什么以及使用模式定义了什么?
答案 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表的大小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;
试一试!!!
答案 1 :(得分:0)
MySQL / InnoDB没有提供任何功能来释放'空间,但它将重新使用已删除行中的空格以用于将来的插入语句。
定期运行OPTIMIZE TABLE
(more information)将有助于最大化您可以重复使用的数量以及提高I / O性能(它基本上就像您的数据库的碎片整理)。