在InnoDB上重建索引

时间:2015-06-16 22:24:41

标签: mysql database indexing innodb

我有200万行和50列的大表 当iam更新/插入大量数据时,我会删除所有索引并使用2个查询重新生成它们。这很好用

但我想考虑使用另一个查询 例如:

ALTER TABLE [table_name]  ENGINE = InnoDB

我在这里阅读了mysql指南http://dev.mysql.com/doc/refman/5.6/en/optimize-table.html

  

InnoDB详细信息

     

对于InnoDB表,OPTIMIZE TABLE映射到ALTER TABLE ... FORCE,   重建表以更新 x统计信息并释放未使用的   聚集索引中的空间。这显示在输出中   在InnoDB表上运行时的OPTIMIZE TABLE

我认为优化会重建索引吗?

 OPTIMIZE TABLE [table_name] 

你推荐什么,我的表有超过200万行和50列

1 个答案:

答案 0 :(得分:4)

你在drop + rebuild之前和之后做过SHOW TABLE STATUS吗? Index_length的变化很大吗?可能不是因为两倍。

我几乎从不建议在InnoDB中重建任何东西。这不值得。一个明显的例外与FULLTEXT索引有关。

是的,虚拟ALTER将重建索引。 OPTIMIZE TABLE也是如此。两者都将"整理" (在某种程度上)二级索引BTrees和主要BTree(包含数据和PRIMARY KEY)。

仅使用ANALYZE TABLE可以更便宜地更新 的统计信息。即便这样也不常见。 5.6有更好的方法来维护统计数据。

如果您尚未使用innodb_file_per_table=ON,我建议您最后一次设置(SET GLOBAL ...)并执行ALTER TABLE tbl ENGINE=InnoDB;

在线修改

要更改ft_*,您需要重建索引。这意味着ALTER(或OPTIMIZE,其实现为ALTER)。较新版本的MySQL具有ALGORITHM=INPLACE,这使得ALTER对正在运行的系统几乎没有影响。但是,有一些限制。查看手册。

非INPLACE ALTER的替代方法是pt-query-digestgh-ost。看看它们中的任何一个是否适用于您的情况。

缺少"重建表格",您可以DROP INDEX ...ADD INDEX ...。同样,我不知道这些是否适用于FT索引" inplace"。无论如何,在此过程中你将失去对该索引的使用。