新特性之自增主键的持久化,自增主键的持久化

作者: 数据库信息  发布:2019-06-23

自增主键未有长久化是个比较早的bug,那一点从其在官方bug网址的id号也可观看()。由PeterZaitsev(现Percona 主管)于二零零四年提议。历史持久且臭名昭著。 

前言

先是,直观的复出下。

自增主键没有悠久化是个比较早的bug,那点从其在官方bug网址的id号也可观察()。由PeterZaitsev(现Percona 首席营业官)于二〇〇〇年提出。历史长久且臭名昭著。

mysql> create table t1(id int auto_increment primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(null),(null),(null);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t1;
 ---- 
| id |
 ---- 
|  1 |
|  2 |
|  3 |
 ---- 
3 rows in set (0.00 sec)

mysql> delete from t1 where id=3;
Query OK, 1 row affected (0.36 sec)

mysql> insert into t1 values(null);
Query OK, 1 row affected (0.35 sec)

mysql> select * from t1;
 ---- 
| id |
 ---- 
|  1 |
|  2 |
|  4 |
 ---- 
3 rows in set (0.01 sec)

率先,直观的再现下。

 

mysql> create table t1(id int auto_increment primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(null),(null),(null);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t1;
 ---- 
| id |
 ---- 
| 1 |
| 2 |
| 3 |
 ---- 
rows in set (0.00 sec)

mysql> delete from t1 where id=3;
Query OK, 1 row affected (0.36 sec)

mysql> insert into t1 values(null);
Query OK, 1 row affected (0.35 sec)

mysql> select * from t1;
 ---- 
| id |
 ---- 
| 1 |
| 2 |
| 4 |
 ---- 
rows in set (0.01 sec)

即使id为3的记录删除了,但再也插入null值时,并不曾选拔被剔除的3,而是分配了4。

虽说id为3的笔录删除了,但再一次插入null值时,并未引用被删去的3,而是分配了4。

 

除去id为4的记录,重启数据库,重新插入二个null值。

去除id为4的笔录,重启数据库,重新插入二个null值。

mysql> delete from t1 where id=4;
# service mysqld restart
mysql> insert into t1 values(null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
 ---- 
| id |
 ---- 
| 1 |
| 2 |
| 3 |
 ---- 
rows in set (0.00 sec)

 

能够观望,新插入的null值分配的是3,遵照重启前的操作逻辑,此处应该分配5哟。

mysql> delete from t1 where id=4;
# service mysqld restart
mysql> insert into t1 values(null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
 ---- 
| id |
 ---- 
|  1 |
|  2 |
|  3 |
 ---- 
3 rows in set (0.00 sec)

那正是自增主键未有长久化的bug。究其原因,在于自增主键的分红,是由InnoDB数据字典里面贰个计数器来决定的,而该计数器只在内部存储器中维护,并不会持久化到磁盘中。当数据库重启时,该计数器会通过下边这种办法初叶化。

 

SELECT MAX(ai_col) FROM table_name FOR UPDATE; 

能够观察,新插入的null值分配的是3,根据重启前的操作逻辑,此处应该分配5啊。

MySQL 8.0的缓和思路

 

将自增主键的计数器持久化到redo log中。每一遍计数器发生改变,都会将其写入到redo log中。若是数据库发生重启,InnoDB会根据redo log中的计数器消息来起头化其内部存款和储蓄器值。为了尽恐怕减小对系统品质的熏陶,计数器写入到redo log中,并不会立时刷新。具体可参看:

那就是自增主键没有漫长化的bug。究其原因,在于自增主键的抽成,是由InnoDB数据字典里面多个计数器来调节的,而该计数器只在内部存款和储蓄器中体贴,并不会悠久化到磁盘中。当数据库重启时,该计数器会通过上边这种情势先河化。

因自增主键未有漫长化而产出问题的广阔现象:澳门金莎娱乐网站

SELECT MAX(ai_col) FROM table_name FOR UPDATE;
  1. 业务将自增主键作为工作主键,同临时间,业务上又须要主键无法重新。

  2. 多少会被归档。在归档的进程中有相当的大大概会产生主键争持。

 

因而,猛烈提议不要采纳自增主键作为专门的学问主键。刨除那多个现象,其实,自增主键未有长久化的标题并不是一点都不小,远未有想像中的”臭名昭著“。

本文由金沙澳门官网发布于数据库信息,转载请注明出处:新特性之自增主键的持久化,自增主键的持久化

关键词: 金沙澳门官网

上一篇:19免安装版的配置方法
下一篇:没有了