14.5.5 AUTO_INCREMENT Handling in InnoDB 在InnoDB AUTO_INCREMENT处理

14.5.5 AUTO_INCREMENT Handling in InnoDB 在InnoDB AUTO_INCREMENT处理

14.5.5.1 Traditional InnoDB Auto-Increment Locking
14.5.5.2 Configurable InnoDB Auto-Increment Locking

InnoDB 提供一个优化的显著的改善可扩展性和性能 ,插入记录到表 使用AUTO_INCREMENT columns.

为了使用AUTO_INCREMENT 机制对于InnoDB 表,一个AUTO_INCREMENT column ai_col 必须定义为索引的一部分,

以至于可以让它可能执行一个等价的一个索引

SELECT MAX(ai_col) 查找表包含 最大值的列 , 这是通过一些表索引的第一列来实现的。

这个章节提供后台信息在原始的(“传统”) 实现auto-increment locking 在InnoDB,

说明可配置的锁机制,文档参数用于配置机制,描述它的行为和复制的互动。

14.5.5.1 Traditional InnoDB Auto-Increment Locking 传统的InnoDB Auto-Increment Locking

auto-increment handling 在InnoDB 的原始实现是使用下面的策略来访问当使用binary log 基于语句的复制

或者对于某些recovery 场景。

如果你指定一个 AUTO_INCREMENT 列对于一个InnoDB 表,表的句柄在InnoDB 数据库目录包含一个特定的统计

称为auto-increment counter 用于给列分配新的值, 这个计数是只存储在主内存,不是磁盘。

InnoDB 使用下面的算法来初始化 auto-increment 计数用于一个表包含一个AUTO_INCREMENT 列

叫做 ai_col:

在server 启动或者在操作一个表后 。

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

InnoDB 增加从语句和分配它到列和给自增列计数取值,默认的, 自增值递增是1,

这可以通过auto_increment_increment配置

mysql> show variables like ‘%auto_increment_increment%’;
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| auto_increment_increment | 1 |
+————————–+——-+
1 row in set (0.00 sec)

如果表是空的,InnoDB 使用值1.

如果 SHOW TABLE STATUS 语句检验 表t在auto-increment counter 被初始化后,

InnoDB 初始化但是不增加值,存储它用于后面的插入。

这个初始化使用一个正常的exclusive-locking read 在表上,锁持续到事务结束。

InnoDB 遵循下面的过程来初始化auto-increment counter 对于刚创建的表

当自动列被初始化化,如果你不显示的指定一个值用于AUTO_INCREMENT 列,

InnoDB 增加列和分配新的值给这个列, 如果你插入一个新的记录显示指定的列,

值是大于当前计数的值, counter 是设置为特定列的值。

如果用户指定NULL 或者0 用于自增列在一个插入, InnoDB 对待记录如果值没有被指定 ,生产一个新的值给它。

自增列机器是没有被定义的如果你分配一个负值,或者如果值变的大于最大值

当访问自增列计数,InnoDB 使用一种特别的 table-level AUTO-INC lock, 保持到当前SQL语句结束,

不是事务的结束。

InnoDB 使用内存自增统计 只要服务器运行,当server 停止和重启后,innoDB 重新初始化计数器

对于每个表 。

14.5.5.2 Configurable InnoDB Auto-Increment Locking 配置InnoDB 自增列锁定

原文地址:https://www.cnblogs.com/hzcya1995/p/13351169.html