mysql - 对 InnoDB 表进行分析和优化

标签 mysql innodb

那时,当我大量使用 MyISAM 表时,我总是有一个运行的 cronjob

~# mysqlanalyze -o database

我知道 MyISAM 在某些方面从中受益,例如:碎片化等等

现在,当在大多数表是 InnoDB 的数据库上运行相同的命令时,我想知道这是否对表“有任何好处”并且被认为是不时这样做的好习惯,或者它是否相当反富有成效的。大量阅读:

Table does not support optimize, doing recreate + analyze instead

关于磁盘 IO/CPU 时间,哪个听起来很昂贵?!

希望对此有一些意见。

最佳答案

https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html说:

For InnoDB tables, OPTIMIZE TABLE is mapped to ALTER TABLE ... FORCE, which rebuilds the table to update index statistics and free unused space in the clustered index.

这在你有太多碎片的情况下确实有一些好处。如果您使用 innodb_file_per_table(这是最近版本的默认设置),页面将被更有效地填充,索引将被重建,并且表占用的磁盘空间将减少。

这确实需要时间,具体取决于您的 table 大小。它会在运行时锁定表。它在运行时需要额外的磁盘空间,因为它会创建表的副本。

在 InnoDB 表上执行优化表通常不需要经常执行,但只有在您以可能导致碎片的方式对表执行大量插入/更新/删除之后才执行。

ANALYZE TABLE 对 InnoDB 的影响要小得多。这不需要构建表的副本。这是一个只读操作,它只是从表中随机读取页面样本,并使用它来估计行数、行的平均大小,并更新有关索引的统计信息,以指导查询优化器。这在任何时候运行都是安全的,它会暂时锁定该表,但无论表的大小如何都不会更大。

关于mysql - 对 InnoDB 表进行分析和优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54850311/

相关文章:

MySQL select_for_update() 和触发器 .. 阻塞是如何工作的?

mysql - 查询时出现错误 'Unknown table engine ' InnoDB''。重启mysql后

mysql - 优化非常大的表查询

mysql - 为什么在表有某种关系时即使在使用多线程之后也需要很长时间才能在 mysql 表中插入行

mysql - Foreach非唯一行获取相关键

mysql - nodejs连接mysql报错

mysql - 无法通过 SonarQube WS API 找到所有问题

php - mysql 显示表中最早的日期

mysql - SQL产品过滤器

mysql 按最大 id 分组并左连接另一个表