何时应该在 mysql 中运行分析表语句

Uda*_*pta 3 mysql

你好 DBA 我还有一些问题

  1. 为什么我们永远不应该运行 ANALYZE TABLE?
  2. 我如何确定需要分析该表/数据库?MySQL 似乎不存储上次更新“stat”的时间?

仅举个例子:- 假设我已经查询过

mysql> show index from goods;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| goods |          0 |  PRIMARY |            1 |          id |         A |     7765796 |     NULL |   NULL |      |      BTREE |         |               |
| goods |          1 |  shop_id |            1 |     shop_id |         A |       14523 |     NULL |   NULL |      |      BTREE |         |               |
| goods |          1 |  shop_id |            2 | create_date |         A |      168168 |     NULL |   NULL |  YES |      BTREE |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

因此,要查看此输出,我如何知道此表需要运行分析表命令?

Bil*_*win 8

我刚刚在我的公司实现了一项服务,定期在 InnoDB 表上运行 ANALYZE TABLE。

我这样做的原因是我们受到了这个bug的影响:InnoDB persistencestatistics not persisted enough

当使用InnoDB持久统计时,大约10%的行被修改后自动刷新表统计。有一个计数器可以跟踪这一点,但计数器本身不是持久的;如果 MySQL 服务器重新启动,它会从 0 重新开始。

我们有一些非常大的表,有数亿行。我们还定期重新启动 MySQL 服务器,因为我们忠实地了解 MySQL 更新和操作系统更新。这两件事的结合导致我们在 10% 的行被修改之前重新启动,因此 InnoDB 表统计信息永远不会更新。

因此,我创建了一个每天访问每个数据库副本集的服务。它检查表mysql.innodb_table_stats,特别是last_update列。这将告诉我自从表统计信息更新以来已经过去了多长时间。

如果给定表的该值超过 90 天,我肯定需要运行 ANALYZE TABLE。

否则,我会进行随机抽样并选择 10% 的表进行分析。这应该会导致平均每十天对每个表进行一次分析。

自然通过检查mysql.innodb_table_stats,只考虑InnoDB表,但我们制定了政策,我们公司只支持InnoDB表。