我们的数据库中有数百个 InnoDB 表,我们使用 phpMyAdmin 来管理它们。不幸的是,SHOW TABLE STATUS
每当显示表列表时,phpMyAdmin 都会执行查询,这似乎会深入研究每个 InnoDB 表以获取大致的行数。
这似乎锁定了整个数据库,这意味着对这个(繁忙的)数据库的所有其他查询都会排队,直到数据库达到最大用户数。
- 能
SHOW TABLE STATUS
合理地加快速度吗? - phpMyAdmin 是否可以轻松修改为不执行完整
SHOW TABLE STATUS
查询,或者至少不会立即锁定整个数据库?
答案1
SHOW TABLE STATUS
不会锁定表 — 至少,我从未遇到过它这样做。此外,InnoDB 的行数SHOW TABLE STATUS
只是一个估计值,因此它绝对不是在做或道德上等同的事情。当运行时COUNT(*)
,您从中得到了什么?SHOW PROCESSLIST
SHOW TABLE STATUS
需要调查的一种可能性是:您的规模table_open_cache
可能太小,导致您在运行状态查询的过程中无法关闭并重新打开许多表。
答案2
刚刚发现innodb_stats_on_metadata
环境,这似乎可以解决问题。禁用 InnoDB 深入索引以获取近似计数。