我正在使用innodb。我的应用程序性能有问题。当我运行mysqlturner.pl
时,我得到:
[ - ] InnoDB表中的数据:8G(表:1890) [!!]总碎片表:1890
好的,我已经运行了mysqlcheck -p --optimize db。 我觉得innodb_file_per_table被禁用了。最近两年,数据库没有重新索引。我怎么能这样做?
一切都会好吗?
答案 0 :(得分:1)
表格分散
伪造。
所有InnoDB表总是(根据该工具)分段。
实际上,1000中只有1个表需要进行碎片整理。
OPTIMIZE TABLE foo;
会对单个表进行碎片整理。但是,再一次,我说"不要打扰"。
ibdata1臃肿
另一方面......如果你担心ibdata1 的大小和 Data_free(SHOW TABLE STATUS
)表明大量的ibdata1是"免费的&#34 ;然后唯一的解决方法是痛苦的:如前所述:dump,stop,remove ibdata1,restart,reload。
但是......如果你没有足够的磁盘空间来倾倒所有东西,你就会陷入深深的野草。
你有8GB的桌子吗? (所有InnoDB表中的Sum Data_length和Index_length。)如果ibdata1是10GB,请不要打扰。如果它是100GB,那么你会浪费很多空间。但是,如果你的磁盘空间不足,我再说“不要打扰”#34;。
如果你的磁盘空间不足和 ibdata1似乎有很多" free",那么就进行转储等。但另外:如果你有1890个表,可能大多数是"微小"。也许有些人有点大?也许某些表的大小波动很大(例如,添加一百万行,然后删除大部分行)?我建议在创建大表或波动表时使innodb_file_per_table为ON;关闭小桌子。
生活在ibdata1中的小桌子占用的空间更小;如果需要,可以通过OPTIMIZE
清除大/波动的表格,如果需要。
答案 1 :(得分:0)
是的,那样做。在开始之前进行备份,并首先在主机副本上测试整个过程,尤其是。确切的mysqldump命令,你不希望转储中的'information_schema'这样的数据库。
还要确保一旦开始导出,其他服务就无法连接到您的数据库 - 他们更改的任何数据都将在导入过程中丢失。
上一个问题中有详细说明: Howto: Clean a mysql InnoDB storage engine?