自增ID有什么坏处?什么样的场景下不使用自增ID?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/84283587

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【自增ID有什么坏处?什么样的场景下不使用自增ID?】

大家好,我是IT修真院深圳分院第13期的学员,一枚正直纯洁善良的java程序员
今天给大家分享一下,修真院官网Java任务1,深度思考中的知识点————自增ID有什么坏处?什么样的场景下不使用自增ID?

  1. 背景介绍
    在MySQL中,数据表的主键一般采用id字段自增的形式。使用自增ID给我们带来不少便捷,但也有不少坏处。

  2. 知识剖析
    2.1什么是自增ID(MySQL数据库)
    自增ID是在设计表时如果将id字段的值设置为自增的形式也就是AUTO_INCREMENT,
    那么当插入一行数据时就无需指定id,数据表会根据前一个id值+1进行填充。
    指定了AUTO_INCREMENT的列必须要建索引,一般把ID作为主键,这样系统会自动为ID建立索引。
    2.2自增ID有什么好处?
    (1) 增加记录时,可以不用指定id字段,不用担心主键重复问题。
    (2)数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;
    (3)数字型,占用空间小,易排序,在程序中传递也方便;

  3. 常见问题
    自增ID有什么坏处?
    (1) 不具有连续性,表中auto_increment最大值被删除,将不会被重用。就是说会跳号(如果设定的auto_increment_increment是1,那么下一次插入的id值将会从被删除的最大值算起,也就是被删除的最大值+1)
    (2)历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id会有冲突,但如果各自的id还关联了其他表,这就很不好操作。
    (3) 很难处理分布式存储的数据表,尤其是需要合并表的情况下
    (4) 在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重;

  4. 解决方案
    4.1自增ID的替代者UUID自增ID的替代者UUID
    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
    UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。

    4.2 UUID的优点
    (1)能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
    (2)保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
    (3)安全性较高
    4.3 UUID的缺点:
    (1)uuid是无序的,这会严重影响到表的插入性能。
    (2)uuid占的空间大

  5. 编码实战

  6. 扩展思考
    由于本人正在学任务一,平时用到的是mysql的自增ID,所以对于自增ID的不具有连续性也是要有解决办法的。
    方法一:可以用insert 语句直接指定id插入语句
    方法二:设置自增值 ALTER TABLE table_name AUTO_INCREMENT = 1;(数字1可以是由你自定义设置的自增值,table_name就是你要使用的数据表)
    方法三:用truncate table table_name ;语句直接清空表数据并重置自增值(table_name就是你要使用的数据表)

  7. 参考文献
    CSDN、百度百科

  8. 更多讨论
    (1) UUID在MySQL中是以什么类型存放的呢?
    在MySQL里保存UUID做主键,一般是使用char类型存放的。
    (网上有说在PostgreSQL等一些数据库里,都有专门的UUID类型,在这些数据库里以UUID做主键,效率是没问题的)
    (2)有没有办法解决UUID在MySQL数据库的效率慢的问题?
    可以把UUID作为逻辑主键,物理主键依然使用自增ID。
    (3)可以改变自增ID每次的自增量吗?
    auto_increment_offset表示自增长字段从哪个数开始。
    auto_increment_increment表示自增长字段每次递增的量,其默认值是1。
    通过set命令修改,不需要重启mysql,但是要重新打开命令行界面,一般需要用set global来设置(自定义等号后面的数字就可以了)
    set global auto_increment_increment=2;
    set global auto_increment_offset=2;

  9. 鸣谢:
    感谢修真院的师兄和CSDN博客上相关的作者,此教程是在他们之前技术分享的基础上完善而成。

  10. 结束语:
    今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/84283587