时间:2021-05-24
显示定义ID
表定义的自增值ID达到上限后,在申请下一个ID时,得到的值保持不变
-- (2^32-1) = 4,294,967,295-- 建议使用 BIGINT UNSIGNEDCREATE TABLE t (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT=4294967295;INSERT INTO t VALUES (null);-- AUTO_INCREMENT没有改变mysql> SHOW CREATE TABLE t;+-------+------------------------------------------------------+| Table | Create Table |+-------+------------------------------------------------------+| t | CREATE TABLE `t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8 |+-------+------------------------------------------------------+mysql> INSERT INTO t VALUES (null);ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY'InnoDB row_id
1、如果创建的InnoDB表没有指定主键,那么InnoDB会创建一个不可见的,长度为6 Bytes的row_id
2、InnoDB维护一个全局的dict_sys.row_id值,所有无主键的InnoDB表,每插入一行数据
3、代码实现上,row_id是一个8 Bytes的BIGINT UNSIGNED
4、在InnoDB里面,申请到row_id=N后,就将这行数据写入表中
5、推荐显示创建自增主键
XID
1、redolog和binlog相配合的时候,有一个共同的字段XID,对应一个事务
2、生成逻辑
3、global_query_id是一个纯内存变量,重启之后清零
4、global_query_id是8 Bytes,上限为2^64-1
InnoDB trx_id
1、XID是由Server层维护的
2、InnoDB内部使用的是trx_id,为的是能够在InnoDB事务和Server层之间做关联
3、InnoDB内部维护一个max_trx_id的全局变量
4、InnoDB数据可见性的核心思想
5、对于正在执行的事务,可以通过information_schema.innodb_trx看到事务的trx_id
操作序列
时刻 session A session B T1 BEGIN;
SELECT * FROM t LIMIT 1; T2 USE information_schema;
SELECT trx_id,trx_mysql_thread_id FROM innodb_trx; T3 INSERT INTO t VALUES (null); T4 SELECT trx_id,trx_mysql_thread_id FROM innodb_trx;
1、trx_mysql_thread_id=30就是线程ID,即session A所在的线程
2、T1时刻,trx_id的值其实为0,而很大的值只是为了显示用的(区别于普通的读写事务)
3、T2时刻,trx_id是一个很大的数字,因为在T1时刻,session A并未涉及更新操作,是一个只读事务
4、session A在T3时刻执行INSERT语句时,InnoDB才真正分配trx_id
只读事务
1、在上面的T2时刻,很大的trx_id是由系统临时计算出来的
2、同一个只读事务在执行期间,它的指针地址是不会变的
3、如果有多个并行的只读事务,每个事务的trx变量的指针地址肯定是不同的
4、加上2^48的目的:保证只读事务显示的trx_id值比较大,用于区别普通的读写事务
5、trx_id与row_id的逻辑类似,定义长度为8 Bytes
6、只读事务不分配trx_id的好处
7、max_trx_id会持久化存储,重启不会重置为0,只有到达2^48-1的上限后,才会重置为0
thread_id
1、SHOW PROCESSLIST的第一列就是thread_id
2、系统保存了一个环境变量thread_id_counter
3、thread_id_counter定义为4 Bytes,因此达到2^32-1后就会重置为0
参考资料
《MySQL实战45讲》
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在mysql中,实现id自增的方式是依靠加一个auto_increment标志,而在pgsql中,id自增是通过序列SEQUENCE。创建表时设置自增序列为:C
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法。
区别:1、主键,Oracle不可以实现自增,mysql可以实现自增。oracle新建序列,SEQ_USER_Id.nextval2、索引:mysql索引从0开始
一、mysql获取当前字段最大idSQL语句:selectmax(id)fromyourtable;二、获取mysql表自增(Auto_increment)值A
mysql遇到自增id用完的情况时,用户只需将自增ID的类型改为BigInt格式即可。 MySQL由瑞典MySQLAB公司开发,是最流行的关系型数据库管理系统