我需要获取表(innodb)的最后一个id(主键),为此我执行以下查询:
SELECT (SELECT `AUTO_INCREMENT` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'mySchema' AND `TABLE_NAME` = 'myTable') - 1;
返回错误的自动增量。问题是,除非我运行以下查询,否则tables table of information\u schema不会用当前值更新:
ANALYZE TABLE `myTable`;
为什么mysql不自动更新信息模式,我如何修复这个行为?
运行mysql server 8.0.13 x64。
2条答案
按热度按时间xfb7svmp1#
将从“最新”插入行获取所有数据。不需要处理
AUTO_INCREMENT
,不需要使用子查询,不ANALYZE
,否information_schema
,一旦你有了id,就没有额外的获取,没有etc,等等。是的,您确实需要在列上设置一个索引,用于确定什么是“最新的”。对,
id
可以使用,但不应该使用。AUTO_INCREMENT
值保证是唯一的,但没有别的。uujelgoq2#
问:为什么mysql不自动更新信息模式,我如何修复这种行为?
答:innodb将自动增量值保存在内存中,并且不会将其保存到磁盘。
元数据查询的行为(例如。
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 TABLE
,我不认为有一个“修复”的问题。(我认为这主要是因为我不认为这是一个需要解决的问题。)
要获得表中自动增量列的最大值,标准模式为:
让我困惑的是为什么我们需要检索这一特定的信息。我们用它干什么?
当然,我们不会在应用程序代码中使用它来确定分配给刚插入的行的值。不能保证最高值不是来自某个其他会话插入的行。我们有
LAST_INSERT_ID()
检索会话刚刚插入的行的值的机制。如果我们按照
ANALYZE TABLE
要刷新统计数据,从这一点到随后的一个问题之间还有一段很短的时间SELECT
... 另一个环节可能会滑进另一个环节INSERT
因此,我们从聚集统计数据中获得的值在检索时可能已经“过时”。