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

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

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

再可以实现一个初步的思路。

  1. mysql> select _rowid,count(*)from redis_backup_result;  
  2. +--------+----------+  
  3. | _rowid | count(*) |  
  4. +--------+----------+  
  5. | 117 | 41036 |  
  6. +--------+----------+  
  7. 1 row in set (0.03 sec) 

然后继续升华一些,借助rownum来实现,当然在MySQL中原生不支持这个特性,需要间接实现。

  1. mysql> SELECT @rowno:=@rowno+1 as rowno,r._rowid from redis_backup_resultr ,(select @rowno:=0) t limit 20;  
  2. +-------+--------+  
  3. | rowno | _rowid |  
  4. +-------+--------+  
  5. | 1 | 117 |  
  6. | 2 | 118 |  
  7. | 3 | 119 |  
  8. | 4 | 120 |  
  9. | 5 | 121 |  
  10. | 6 | 122 |  
  11. | 7 | 123 |  
  12. | 8 | 124 |  
  13. | 9 | 125 |  
  14. | 10 | 126 |  
  15. | 11 | 127 |  
  16. | 12 | 128 |  
  17. | 13 | 129 |  
  18. | 14 | 130 |  
  19. | 15 | 131 |  
  20. | 16 | 132 |  
  21. | 17 | 133 |  
  22. | 18 | 134 |  
  23. | 19 | 135 |  
  24. | 20 | 136 |  
  25. +-------+--------+  
  26. 20 rows in set (0.00 sec) 

写一个完整的语句,如下:

  1. mysql> SELECT @rowno:=@rowno+1 as rowno,r._rowid ,backup_date,count(*)  
  2. from redis_backup_result r ,(select @rowno:=0) t ;  
  3. +-------+--------+-------------+----------+  
  4. | rowno | _rowid | backup_date | count(*) |  
  5. +-------+--------+-------------+----------+  
  6. | 1 | 117 | 2018-08-14 | 41061 |  
  7. +-------+--------+-------------+----------+  
  8. 1 row in set (0.02 sec) 

通过这个案例,可以很明显发现是第1行的记录,然后做了count(*)的操作。

当然我们的目标是要掌握rowid和主键的一些关联关系,所以我们也复盘一下主键使用中的隐患问题。

问题2rowid和主键有什么关联关系

在学习MySQL开发规范之索引规范的时候,强调过一个要点:每张表都建议有主键。我们在这里来简单分析一下为什么?

除了规范,从存储方式上来说,在InnoDB存储引擎中,表都是按照主键的顺序进行存放的,我们叫做聚簇索引表或者索引组织表(IOT),表中主键的参考依据如下:

(1)显式的创建主键Primary key。

(2)判断表中是否有非空唯一索引,如果有,则为主键。

(3)如果都不符合上述条件,则会生成UUID的一个隐式主键(6字节大)。

从以上可以看到,MySQL对于主键有一套维护机制,而一些常见的索引也会产生相应的影响,比如唯一性索引、非唯一性索引、覆盖索引等都是辅助索引(secondary index,也叫二级索引),从存储的角度来说,二级索引列中默认包含主键列,如果主键太长,也会使得二级索引很占空间。

问题3在主键的使用中存在哪些隐患

这就引出行业里非常普遍的主键性能问题,这不是一个单一的问题,需要MySQL方向持续改造的,将技术价值和业务价值结合起来。我看到很多业务中设置了自增列,但是大多数情况下,这种自增列却没有实际的业务含义,尽管是主键列保证了ID的唯一性,但是业务开发无法直接根据主键自增列来进行查询,于是他们需要寻找新的业务属性,添加一系列的唯一性索引,非唯一性索引等等,这样一来我们坚持的规范和业务使用的方式就存在了偏差。

(编辑:衡阳站长网)

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

热点阅读