从另外一个维度来说,我们对于主键的理解是有偏差的,我们不能单一的认为主键就一定是从1开始的整数类型,我们需要结合业务场景来看待,比如我们的身份证其实就是一个不错的例子,把证号分成了几个区段,偏于检索和维护;或者是外出就餐时得到的流水单号,它都有一定的业务属性在里面,对于我们去理解业务的使用是一种不错的借鉴。
问题4:如何来理解rowid的潜在瓶颈并进行调试验证
我们知道rowid只有6个字节,因此最大值是2^48,所以一旦 row_id超过这个值还是会递增,这种情况下是否存在隐患。
光说不练假把式,我们可以做一个测试来说明。
1)我们创建一张表test_inc,不包含任何索引。
create table test_inc(id int) engine=innodb;
2)通过ps -ef|grep mysql得到对应的进程号,使用gdb来开始做下调试配置,切记!此处应该是自己的测试环境。
- [root@dev01 mysql]# gdb -p 3132 -ex 'p dict_sys->row_id=1' -batch
- [New LWP 3192]
- [New LWP 3160]
- [New LWP 3159]
- [New LWP 3158]
- [New LWP 3157]
- [New LWP 3156]
- [New LWP 3155]
- [New LWP 3154]
- [New LWP 3153]
- [New LWP 3152]
- [New LWP 3151]
- [New LWP 3150]
- [New LWP 3149]
- [New LWP 3148]
- [New LWP 3147]
- [New LWP 3144]
- [New LWP 3143]
- [New LWP 3142]
- [New LWP 3141]
- [New LWP 3140]
- [New LWP 3139]
- [New LWP 3138]
- [New LWP 3137]
- [New LWP 3136]
- [New LWP 3135]
- [New LWP 3134]
- [New LWP 3133]
- [Thread debugging using libthread_db enabled]
- 0x00000031ed8df283 in poll from /lib64/libc.so.6
- $1 = 1
3)我们做下基本检验,得到建表语句,保证测试是预期的样子。
- mysql> show create table test_incG
- *************************** 1. row ***************************
- Table: test_inc
- Create Table: CREATE TABLE `test_inc` (
- `id` int(11) DEFAULT
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 1 row in set (0.00 sec)
4)插入一些数据,使得rowid持续自增。
- mysql> insert into test_inc values(1),(2),(3);
- Query OK, 3 rows affected (0.08 sec)
- Records: 3 Duplicates: 0 Warnings: 0
5)我们对rowid进行重置,调整为2^48
- mysql> select power(2,48);
- +-----------------+
- | power(2,48) |
- +-----------------+
- | 281474976710656 |
- +-----------------+
- 1 row in set (0.00 sec)
- [root@dev01 mysql]# gdb -p 3132 -ex 'p dict_sys->row_id=281474976710656' -batch
- ...
- ...
- [Thread debugging using libthread_db enabled]
- 0x00000031ed8df283 in poll from /lib64/libc.so.6
- $1 = 281474976710656
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|