MySQL与主流分支版本上执行ANALYZE TABLE 安全么?
有时,需要使用 ANALYZE TABLE[1] 手动更新表和索引统计信息。不深入探讨这种需求原因的情况下,我们就生产系统上运行命令相关的开销来聊聊这个话题。然而,这里讨论的开销与深入表行收集统计信息的通常成本无关,我们可以通过设置样本页数[2] 来控制。
Sveta 曾发布了一篇不错的博客文章[3],介绍了 Percona Server for MySQL 中引入的一项改进,以解一些不必要的等待《ANALYZE TABLE 不再是阻塞操作》[4]。
从历史上看,在 MySQL 中运行 ANALYZE TABLE 命令的问题是查询需要在表的表定义缓存条目上使用排他锁。这使得查询等待任何长时间运行的查询完成,但也可能触发级联等待其他传入请求。简而言之,ANALYZE 可能会导致高负载生产环境中出现较高的延时。
从那时起,MySQL/Percona/MariaDB 都发生了一些变化,但今天仍然存在许多生产系统会受影响的版本。让我们回顾一下这些年来情况的演变。