fan*_*nts 52
这是完成的
ANALYZE TABLE table_name;
Run Code Online (Sandbox Code Playgroud)
在这里阅读更多相关信息.
ANALYZE TABLE分析并存储表的密钥分发.在分析过程中,表被锁定,具有MyISAM,BDB和InnoDB的读锁定.此语句适用于MyISAM,BDB,InnoDB和NDB表.
Ric*_*mes 26
为什么?几乎从不需要更新统计数据.甚至更少需要重建索引.
OPTIMIZE TABLE tbl;将重建索引并做ANALYZE; 这需要时间.
ANALYZE TABLE tbl;InnoDB快速重建统计数据.使用5.6.6甚至更少需要.
迄今为止(mysql 8.0.18)在mysql内部没有合适的函数来重新创建索引。
由于 mysql 8.0 myisam 正在慢慢进入弃用状态,innodb 是当前的主要存储引擎。
在大多数实际情况下,innodb 是最佳选择,它应该保持索引正常工作。
在大多数实际情况下,innodb 也做得很好,您不需要重新创建索引。几乎总是。
当涉及具有数百 GB 数据和行的大型表和大量写入情况时,索引可能会降低性能。
在我的个人情况下,我看到性能从使用二级索引的 count(*) 的约 15 分钟下降到 2 个月后以线性时间增加写入表的 4300 分钟。
重新创建索引后,性能又回到了 15 分钟。
迄今为止,我们有两种选择来做到这一点:
1) OPTIMIZE TABLE (或 ALTER TABLE)
Innodb 不支持优化,因此在这两种情况下,整个表都将被读取并重新创建。
这意味着您需要临时文件的存储空间并依赖于表很多时间(我有优化需要一周才能完成的情况)。这将压缩数据并重建所有索引。
尽管没有得到官方推荐,但我强烈推荐在大小不超过 100GB 的大量写入表上使用 OPTIMIZE 过程。
2) ALTER TABLE DROP KEY -> ALTER TABLE ADD KEY
您按名称手动删除密钥,然后再次手动创建。在生产环境中,您首先要创建它,然后删除旧版本。
好处:这可能比优化快得多。缺点:您需要手动创建语法。
“SHOW CREATE TABLE”可用于快速查看哪些索引可用以及它们是如何调用的。
附录:
1) 要更新统计信息,您可以使用已经提到的“分析表”。
2) 如果您在写大量服务器上遇到性能下降,您可能需要重新启动 mysql。当前的 mysql (8.0) 中有几个错误可能会导致显着的速度减慢,而不会显示在错误日志中。最终,这些减速会导致服务器崩溃,但可能需要数周甚至数月的时间来建立崩溃,在此过程中,服务器的响应速度越来越慢。
3) 如果您希望重新创建一个需要数周才能完成或由于内部数据完整性问题在数小时后失败的大表,您应该执行 CREATE TABLE LIKE, INSERT INTO SELECT *。然后“原子重命名”表。
4) 如果 INSERT INTO SELECT * 需要几个小时到几天才能在巨大的表上完成,您可以使用多线程方法将过程加快大约 20-30 倍。您将表“分区”为多个块并并行 INSERT INTO SELECT *。