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 列
你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 的替代方法ALTER是pt-query-digest或gh-ost。看看它们中的任何一个是否适用于您的情况。
除了“重建表”之外,您还可以DROP INDEX ...和ADD INDEX .... 同样,我不知道这些是否适用于 FT 索引“就地”。无论如何,在此过程中您将无法使用该索引。