【问题标题】:MySQL “Show table status”, auto increment is not providing next valueMySQL“显示表状态”,自动增量不提供下一个值
【发布时间】:2020-01-14 19:15:42
【问题描述】:

我最近安装了一个具有更新 MySQL 版本(从 8.0.13 到 8.0.16)的新服务器,在检索表的下一个自动增量值时我有不同的行为。

我最初使用的是

SHOW TABLE STATUS WHERE `Name` = 'user';

在我以前的服务器中它运行良好,我能够检索下一条记录的下一个自动增量值,但是对于新服务器,相同的命令无法正常工作,显示的 auto_increment 值不是下一个

我发现一个帖子提到这可能是由于统计表的缓存但在两台服务器上我都有

show variables like 'information_schema_stats_expiry';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| information_schema_stats_expiry | 86400 |
+---------------------------------+-------+

还有一个解决办法,就是使用命令禁用这个表的缓存

SET PERSIST information_schema_stats_expiry = 0

但我有两个问题:

  • 首先:我在哪里设置 information_schema_stats_expiry ?我无法在 SQL 命令行上启动此命令,也无法在 mysql 配置文件中
  • 第二个:如果我们禁用这个表的缓存,整体数据库性能会不会有问题?

【问题讨论】:

  • 您看到SHOW CREATE TABLE user 的自动增量正确吗?
  • 我可以看到我的 id 设置为 NOT NULL AUTO_INCREMENT 的创建表函数
  • AUTO_INCREMENT =的最后说了什么?
  • 没什么,只是 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,....
  • 最后我有 ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8 和命令 SHOW TABLE STATUS WHERE Name = 'user';给我79.....

标签: mysql


【解决方案1】:

我不确定为什么当您从 8.0.13 升级到 8.0.16 时这种情况发生了变化。 documentation 表示此变量是在 8.0.3 中添加的。

这可以设置为会话变量,因此您可以在需要获取AUTO_INCREMENT 值的会话中将其设置为0,并且它应该绕过缓存。但它不会影响其他会话,因此对性能的整体影响应该很小。

SET information_schema_stats_expiry = 0;
SHOW TABLE STATUS WHERE `Name` = 'user';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2016-01-08
    • 2014-07-06
    相关资源
    最近更新 更多