我有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列
答案 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-digest
或gh-ost
。看看它们中的任何一个是否适用于您的情况。
缺少"重建表格",您可以DROP INDEX ...
和ADD INDEX ...
。同样,我不知道这些是否适用于FT索引" inplace"。无论如何,在此过程中你将失去对该索引的使用。