我有使用MS SQL服务器的经验,对update statistic和rebuild indexes有用且有用。我在MySQL innoDB中找不到这样的选项,有这样的选择吗?如果没有,MySQL数据库如何创建执行计划? MySQL是否更新了每个UPDATE和INSERT的索引和统计信息?
答案 0 :(得分:45)
这是通过
完成的ANALYZE TABLE table_name;
详细了解here。
ANALYZE TABLE分析并存储表的密钥分发。在分析过程中,表被锁定,具有MyISAM,BDB和InnoDB的读锁定。此语句适用于MyISAM,BDB,InnoDB和NDB表。
答案 1 :(得分:21)
为什么呢?几乎从不需要更新统计数据。甚至更少需要重建索引。
OPTIMIZE TABLE tbl;
将重建索引并执行ANALYZE
;这需要时间。
ANALYZE TABLE tbl;
快速让InnoDB重建统计数据。使用5.6.6甚至不需要它。
答案 2 :(得分:6)
You can also use the provided CLI tool mysqlcheck
to run the optimizations. It's got a ton of switches but at its most basic you just pass in the database, username, and password.
Adding this to cron or the Windows Scheduler can make this an automated process. (MariaDB but basically the same thing.)
答案 3 :(得分:3)
到目前为止(mysql 8.0.18),mysql内部没有合适的函数来重新创建索引。
由于mysql 8.0 myisam正在逐步淘汰,因此innodb是当前的主要存储引擎。
在大多数实际情况下,innodb是最好的选择,并且应该使索引正常工作。
在大多数实际情况下,innodb也会做得很好,您不需要重新创建索引。几乎总是。
当涉及具有数百GB数据amd行的大型表并且大量编写情况更改时,索引可能会降低性能。
就我个人而言,我看到性能从使用辅助索引的count(*)的15分钟左右下降到写入表2个月(线性时间增加)后的4300分钟。
重新创建索引后,性能将恢复到15分钟。
到目前为止,我们有两个选择可以做到这一点:
1)优化表(或ALTER TABLE)
Innodb不支持优化,因此在两种情况下都将读取并重新创建整个表。
这意味着您需要存储临时文件,并且需要大量时间取决于表(我认为优化需要一周的时间才能完成)。
这将压缩数据并重建所有索引。
尽管没有被正式推荐,但我还是强烈建议对容量高达100GB的大量写表进行OPTIMIZE处理。
2)ALTER TABLE DROP KEY-> ALTER TABLE ADD KEY
您按名称手动放置密钥,然后再次手动创建它。在生产环境中,您需要先创建它,然后删除旧版本。
好处:这可能比优化快得多。缺点:您需要手动创建语法。
“ SHOW CREATE TABLE”可用于快速查看哪些索引可用以及如何调用它们。
附录:
1)要仅更新统计信息,可以使用已经提到的“ ANALYZE TABLE”。
2)如果在写繁重的服务器上性能下降,则可能需要重新启动mysql。当前的mysql(8.0)中有几个错误,这些错误可能会导致严重的速度下降,而不会出现在错误日志中。最终,这些速度下降会导致服务器崩溃,但是要花上几周甚至几个月的时间才能解决崩溃,在此过程中,服务器的响应速度越来越慢。
3)如果您希望重新创建一个大型表,该表需要数周才能完成,或者由于内部数据完整性问题而在数小时后失败,则应执行CREATE TABLE LIKE,INSERT INTO SELECT *。然后“原子重命名”表。
4)如果在大型表上完成INSERT INTO SELECT *需要花费数小时至数天的时间,则可以使用多线程方法将处理速度提高大约20-30倍。您可以将表“划分”为多个块,然后并行插入SELECT *。
答案 4 :(得分:0)
对于基本清理和重新分析,您可以运行“ OPTIMIZE TABLE ...”,它将压缩索引中的开销并也运行ANALYZE TABLE,但是不会对它们进行重新排序并使它们变小高效。
https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html
但是,如果希望完全重建索引以获得最佳性能,则可以:
https://dev.mysql.com/doc/refman/8.0/en/rebuilding-tables.html
如果您对字段(属于索引的一部分)执行ALTER TABLE并更改其类型,那么它还将完全重建相关的索引。