加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中的主键和rowid,看似简单,其实有一些使用陷阱需要注意

发布时间:2019-10-11 14:03:55 所属栏目:MySql教程 来源:杨建荣
导读:大家在MySQL中我们可能听到过rowid的概念,但是却很难去测试实践,不可避免会有一些疑惑,比如: 1)如何感受到rowid的存在 2)rowid和主键有什么关联关系 3)在主键的使用中存在哪些隐患 4)如何来理解rowid的潜在瓶颈并调试验证 今天要和大家一起讨论这

从另外一个维度来说,我们对于主键的理解是有偏差的,我们不能单一的认为主键就一定是从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来开始做下调试配置,切记!此处应该是自己的测试环境。

  1. [root@dev01 mysql]# gdb -p 3132 -ex 'p dict_sys->row_id=1' -batch  
  2. [New LWP 3192]  
  3. [New LWP 3160]  
  4. [New LWP 3159]  
  5. [New LWP 3158]  
  6. [New LWP 3157]  
  7. [New LWP 3156]  
  8. [New LWP 3155]  
  9. [New LWP 3154]  
  10. [New LWP 3153]  
  11. [New LWP 3152]  
  12. [New LWP 3151]  
  13. [New LWP 3150]  
  14. [New LWP 3149]  
  15. [New LWP 3148]  
  16. [New LWP 3147]  
  17. [New LWP 3144]  
  18. [New LWP 3143]  
  19. [New LWP 3142]  
  20. [New LWP 3141]  
  21. [New LWP 3140]  
  22. [New LWP 3139]  
  23. [New LWP 3138]  
  24. [New LWP 3137]  
  25. [New LWP 3136]  
  26. [New LWP 3135]  
  27. [New LWP 3134]  
  28. [New LWP 3133]  
  29. [Thread debugging using libthread_db enabled]  
  30. 0x00000031ed8df283 in poll from /lib64/libc.so.6  
  31. $1 = 1 

3)我们做下基本检验,得到建表语句,保证测试是预期的样子。

  1. mysql> show create table test_incG  
  2. *************************** 1. row ***************************  
  3. Table: test_inc  
  4. Create Table: CREATE TABLE `test_inc` (  
  5. `id` int(11) DEFAULT  
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
  7. 1 row in set (0.00 sec) 

4)插入一些数据,使得rowid持续自增。

  1. mysql> insert into test_inc values(1),(2),(3);  
  2. Query OK, 3 rows affected (0.08 sec)  
  3. Records: 3 Duplicates: 0 Warnings: 0 

5)我们对rowid进行重置,调整为2^48

  1. mysql> select power(2,48);  
  2. +-----------------+  
  3. | power(2,48) |  
  4. +-----------------+  
  5. | 281474976710656 |  
  6. +-----------------+  
  7. 1 row in set (0.00 sec)  
  8. [root@dev01 mysql]# gdb -p 3132 -ex 'p dict_sys->row_id=281474976710656' -batch  
  9. ...  
  10. ...
  11. [Thread debugging using libthread_db enabled]  
  12. 0x00000031ed8df283 in poll from /lib64/libc.so.6  
  13. $1 = 281474976710656 

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读