Q:为什么 MySQL 不自动更新 information_schema,我该如何修复此行为?
A:InnoDB 将 auto_increment 值保存在内存中,并且不会将其持久保存到磁盘中。
元数据查询的行为(例如SHOW TABLE STATUS
) 受设置的影响innodb_stats_on_metadata
and innodb_stats_persistent
变量。
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
每次查询元数据时强制进行 ANALYZE 可能会降低性能。
除了这些变量的设置之外,或者通过手动执行强制收集统计信息ANALYZE TABLE
,我认为这个问题没有“解决办法”。
(我认为这主要是因为我认为这不是一个需要解决的问题。)
要获取表中 auto_increment 列的最高值,规范模式是:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
让我困惑的是为什么我们需要检索这条特定的信息。我们要用它做什么?
当然,我们不会在应用程序代码中使用它来确定分配给我们刚刚插入的行的值。无法保证最高值不是来自其他会话插入的行。我们有LAST_INSERT_ID()
检索会话刚刚插入的行的值的机制。
如果我们选择ANALYZE TABLE
刷新统计数据,与后续数据之间还有一小段时间SELECT
...另一个会话可能会插入另一个会话INSERT
因此,当我们检索它时,我们从收集的统计数据中获得的值可能已经“过时”。