当innodb_file_per_table禁用时优化innodb表

时间:2015-11-25 21:54:40

标签: mysql performance

我正在使用innodb。我的应用程序性能有问题。当我运行mysqlturner.pl时,我得到:

[ - ] InnoDB表中的数据:8G(表:1890) [!!]总碎片表:1890

好的,我已经运行了mysqlcheck -p --optimize db。 我觉得innodb_file_per_table被禁用了。最近两年,数据库没有重新索引。我怎么能这样做?

  1. 制作mysqldump?
  2. 停止mysql serice?
  3. 将enable innodb_file_per_table插入my.cnf?
  4. 启动mysql serice?
  5. 从mysqldump导入?
  6. 运行mysqlcheck -p --optimize db?
  7. 一切都会好吗?

2 个答案:

答案 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?