我需要获取表(InnoDB)的最后一个id (主键),并执行以下查询:
SELECT (SELECT `AUTO_INCREMENT` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'mySchema' AND `TABLE_NAME` = 'myTable') - 1;
返回错误的AUTO_INCREMENT。问题是,除非我运行以下查询,否则information_schema的表表不会用当前值更新:
ANALYZE TABLE `myTable`;
为什么MySQL不自动更新information_schema,以及如何修复此行为?
运行MySQL服务器8.0.13 X64。
发布于 2018-12-19 16:44:12
Q:为什么MySQL不自动更新information_schema,以及如何修复这种行为?
A: InnoDB在内存中保存auto_increment值,并且不会将其持久化到磁盘。
元数据查询(如SHOW TABLE STATUS
)的行为受innodb_stats_on_metadata
和innodb_stats_persistent
变量设置的影响。
每次查询元数据时强制进行分析可能会降低性能。
除了这些变量的设置,或者强制通过手动执行ANALYZE TABLE
来收集统计信息之外,我认为这个问题没有“修复”。
(我认为这主要是因为我不认为这是一个需要解决的问题。)
要获得表中auto_increment列的最高值,规范模式是:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
令我困惑的是,为什么我们需要检索这一特定的信息。我们要用它做什么?
当然,我们不会在应用程序代码中使用它来确定分配给我们刚刚插入的行的值。不能保证最高值不是来自由其他会话插入的行。我们有LAST_INSERT_ID()
机制来检索会话刚刚插入的行的值。
如果我们使用ANALYZE TABLE
来刷新统计信息,那么与后续的SELECT
之间还有一段很短的时间.另一个会话可能滑到另一个INSERT
中,这样我们从集合统计数据中获得的值在检索时可能会“过时”。
发布于 2018-12-19 17:10:03
SELECT * FROM tbl ORDER BY insert_datetime DESC LIMIT 1;
将从“最新”插入的行中获取所有数据。不需要处理AUTO_INCREMENT
,不需要使用子查询,没有ANALYZE
,没有information_schema
,没有额外的抓取,一旦你有了id,没有等等。
是的,您确实需要在列上使用一个索引来确定什么是“最新的”。是的,可以使用id
,但不应该使用它。AUTO_INCREMENT
值保证是唯一的,但没有其他的。
https://stackoverflow.com/questions/53855219
复制相似问题