4 rows in set (0.00 sec)
可以看到,虽然事务回滚了,但自增id已经回不到从前啦,唯一键冲突也是这样的,这里就不做测试了 。
在批量插入时(insert select等) , 也存在空洞的问题 。看下面实验:
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|1| aaa|
|2| aaa|
|3| aaa|
|4| aaa|
+----+------+
4 rows in set (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|5 |
+----------------+
1 row in set (0.00 sec)
[root@localhost][test1] insert intot(name) select name from t;
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0Warnings: 0
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|1| aaa|
|2| aaa|
|3| aaa|
|4| aaa|
|5| aaa|
|6| aaa|
|7| aaa|
|8| aaa|
+----+------+
8 rows in set (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|12 |
+----------------+
1 row in set (0.00 sec)
可以看到,批量插入,导致下一个id值不为9了,再插入数据,即产生了空洞 , 这里是由mysql申请自增值的机制所造成的 , MySQL在批量插入时 , 若一个值申请一个id,效率太慢,影响了批量插入的速度 , 故mysql采用下面的策略批量申请id 。
1.语句执行过程中 , 第一次申请自增id,会分配1个;
2.1个用完以后,这个语句第二次申请自增id,会分配2个;
3.2个用完以后,还是这个语句,第三次申请自增id,会分配4个;
4.依此类推,同一个语句去申请自增id,每次申请到的自增id个数都是上一次的两倍 。
在对自增列进行操作时 , 存在着自增锁,mysql的innodb_autoinc_lock_mode参数控制着自增锁的上锁机制 。该参数有0、1、2三种模式:
0:语句执行结束后释放自增锁,MySQL5.0时采用这种模式,并发度较低 。
1:mysql的默认设置 。普通的insert语句申请后立马释放,insert select、replace insert、load data等批量插入语句要等语句执行结束后才释放,并发读得到提升
2:所有的语句都是申请后立马释放,并发度大大提升!但是在binlog为statement格式时,主从数据会发生不一致 。这一块网上有很多介绍,我不做介绍了 。
在彻底了解了MYSQL的自增机制以后,在实际生产中就能灵活避坑,这里建议不要用自增id值去当表的行数,当需要对大表准确统计行数时 , 可以去count(*)从库,如果业务很依赖大表的准确行数,直接弄个中间表来统计,或者考虑要不要用mysql的innodb来存储数据 , 这个是需要自己去权衡 。另外对于要求很高的写入性能,但写入量又比较大的业务 , 自增id的使用依然存在热点写入的问题,存在性能瓶颈,这时候可通过分库分表来解决 。
如何在MYSQL插数据ID自增如何在MYSQL插数据ID自增的方法 。
如下参考:
1.在添加字段之前,第一个应该首先检查当前tb1表的结构,如下图所示 。
2.实例字段列添加到表,如下所示 。
3.再次看表结构和比较之前和之后的情况添加字段,如下图所示 。
4.最后,插入新的数据行看到的样子 , 最后添加自动增长的字段,如下所示 。
注意事项:
MySQL使用的SQL语言是访问数据库最常用的标准语言 。MySQL软件采用双重许可政策,分为社区版,商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特性,一般中小网站开发选择MySQL作为数据库 。
推荐阅读
- chatgpt让别人写code,怎么用chatGpt写论文
- java游戏魂斗罗源代码,c++魂斗罗源代码
- jquery怎么获得对象的父级,jquery获取当前对象的id
- 插卡路由器用网线怎么连接,插卡路由器能接电脑吗
- s函数中C语言 c语言的srand函数
- sapsavetext的简单介绍
- 苹果手机拳击格斗游戏,iphone格斗游戏
- html5滚动时间选择,html滚动设置
- c语言编写函数求和 c语言用函数求和的程序