你好 DBA 我还有一些问题
仅举个例子:- 假设我已经查询过
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)
因此,要查看此输出,我如何知道此表需要运行分析表命令?
我刚刚在我的公司实现了一项服务,定期在 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表。