mysql不更新信息\u模式,除非我手动运行analyze table`mytable`

p1iqtdky  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(396)

我需要获取表(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。

xfb7svmp

xfb7svmp1#

SELECT * FROM tbl ORDER BY insert_datetime DESC LIMIT 1;

将从“最新”插入行获取所有数据。不需要处理 AUTO_INCREMENT ,不需要使用子查询,不 ANALYZE ,否 information_schema ,一旦你有了id,就没有额外的获取,没有etc,等等。
是的,您确实需要在列上设置一个索引,用于确定什么是“最新的”。对, id 可以使用,但不应该使用。 AUTO_INCREMENT 值保证是唯一的,但没有别的。

uujelgoq

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 ,我不认为有一个“修复”的问题。
(我认为这主要是因为我不认为这是一个需要解决的问题。)
要获得表中自动增量列的最大值,标准模式为:

SELECT MAX(`ai_col`) FROM `myschema`.`mytable`

让我困惑的是为什么我们需要检索这一特定的信息。我们用它干什么?
当然,我们不会在应用程序代码中使用它来确定分配给刚插入的行的值。不能保证最高值不是来自某个其他会话插入的行。我们有 LAST_INSERT_ID() 检索会话刚刚插入的行的值的机制。
如果我们按照 ANALYZE TABLE 要刷新统计数据,从这一点到随后的一个问题之间还有一段很短的时间 SELECT ... 另一个环节可能会滑进另一个环节 INSERT 因此,我们从聚集统计数据中获得的值在检索时可能已经“过时”。

相关问题