在 InnoDB 上重建索引

inv*_*tor 1 mysql database indexing innodb

我有 200 万行和 50 列的大表。
当我更新/插入大量数据时,我会删除所有索引并使用 2 个查询再次重建它们。这工作正常

但是我想为那个例子使用另一个查询:

ALTER TABLE [table_name]  ENGINE = InnoDB
Run Code Online (Sandbox Code Playgroud)

正如我从这里的 mysql 指南中阅读的那样http://dev.mysql.com/doc/refman/5.6/en/optimize-table.html

InnoDB 详细信息

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

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

 OPTIMIZE TABLE [table_name] 
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*mes 6

SHOW TABLE STATUS在drop+rebuild之前和之后都在做什么?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 的替代方法ALTERpt-query-digestgh-ost。看看它们中的任何一个是否适用于您的情况。

除了“重建表”之外,您还可以DROP INDEX ...ADD INDEX .... 同样,我不知道这些是否适用于 FT 索引“就地”。无论如何,在此过程中您将无法使用该索引。