首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL不更新information_schema,除非我手动运行分析表“`myTable`”

MySQL不更新information_schema,除非我手动运行分析表“`myTable`”
EN

Stack Overflow用户
提问于 2018-12-19 16:17:51
回答 2查看 10.5K关注 0票数 11

我需要获取表(InnoDB)的最后一个id (主键),并执行以下查询:

代码语言:javascript
运行
复制
SELECT (SELECT `AUTO_INCREMENT` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'mySchema' AND `TABLE_NAME` = 'myTable') - 1;

返回错误的AUTO_INCREMENT。问题是,除非我运行以下查询,否则information_schema的表表不会用当前值更新:

代码语言:javascript
运行
复制
ANALYZE TABLE `myTable`;

为什么MySQL不自动更新information_schema,以及如何修复此行为?

运行MySQL服务器8.0.13 X64。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-19 16:44:12

Q:为什么MySQL不自动更新information_schema,以及如何修复这种行为?

A: InnoDB在内存中保存auto_increment值,并且不会将其持久化到磁盘。

元数据查询(如SHOW TABLE STATUS)的行为受innodb_stats_on_metadatainnodb_stats_persistent变量设置的影响。

metadata

每次查询元数据时强制进行分析可能会降低性能。

除了这些变量的设置,或者强制通过手动执行ANALYZE TABLE来收集统计信息之外,我认为这个问题没有“修复”。

(我认为这主要是因为我不认为这是一个需要解决的问题。)

要获得表中auto_increment列的最高值,规范模式是:

代码语言:javascript
运行
复制
 SELECT MAX(`ai_col`) FROM `myschema`.`mytable`

令我困惑的是,为什么我们需要检索这一特定的信息。我们要用它做什么?

当然,我们不会在应用程序代码中使用它来确定分配给我们刚刚插入的行的值。不能保证最高值不是来自由其他会话插入的行。我们有LAST_INSERT_ID()机制来检索会话刚刚插入的行的值。

如果我们使用ANALYZE TABLE来刷新统计信息,那么与后续的SELECT之间还有一段很短的时间.另一个会话可能滑到另一个INSERT中,这样我们从集合统计数据中获得的值在检索时可能会“过时”。

票数 11
EN

Stack Overflow用户

发布于 2018-12-19 17:10:03

代码语言:javascript
运行
复制
SELECT * FROM tbl ORDER BY insert_datetime DESC LIMIT 1;

将从“最新”插入的行中获取所有数据。不需要处理AUTO_INCREMENT,不需要使用子查询,没有ANALYZE,没有information_schema,没有额外的抓取,一旦你有了id,没有等等。

是的,您确实需要在列上使用一个索引来确定什么是“最新的”。是的,可以使用id,但不应该使用它。AUTO_INCREMENT值保证是唯一的,但没有其他的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53855219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档