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 自增列锁定