Q: MySQL为什么不自动更新information_schema,我该如何解决这个问题?
A: InnoDB将auto_increment值保存在内存中,并不将其持久化到磁盘。
元数据查询的行为(例如 SHOW TABLE STATUS
)受 innodb_stats_on_metadata
和 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
,因此我们从收集统计数据中获得的值可能在我们检索它时已经过时了。