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

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

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

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

1.背景介绍

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

2.知识剖析

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

3.常见问题

  1. 自增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;

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

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

PPT链接 视频链接

自增ID有什么坏处?什么样的场景下不使用自增ID? 1相关推荐

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

    大家好,我是IT修真院上海分院第3期学员,一枚正直善良的java程序员,今天给大家分享一下,修真院java任务中的一个知识点:自增ID有什么坏处?什么样的场景下不使用自增ID? 1.背景 对于MySQ ...

  2. 如何在分布式场景下生成全局唯一 ID ?

    作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...

  3. 难道主键除了自增就是GUID?支持k8s等分布式场景下的id生成器了解下

    背景 主键(Primary Key),用于唯一标识表中的每一条数据.所以,一个合格的主键的最基本要求应该是唯一性. 那怎么保证唯一呢?相信绝大部分开发者在刚入行的时候选择的都是数据库的自增id,因为这 ...

  4. 数据库授予用户增删改查的权限的语句_mysql数据库终端上的增删改查及权限等相关操作...

    ctrl + c 终止 [linux] service mysql start 启动mysql service mysql stop 停止mysql service mysql restart 重启m ...

  5. 在有子增列的表中插入一笔数据同时获得自增列号码

    INSERT INTO ConCall_Reservation (列1,列2--) VALUES(值1,值2--): SELECT @@IDENTITY AS ID; 新增数据的同时,返回新增数据的自 ...

  6. 【283期】面试官问:高并发场景下,如何保证全局唯一分布式 ID 生成?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 前言 系统 ...

  7. mysql数据库增删改查关键字_MySQL数据库(二)-数据库的增删改查

    简介: 以下是MySQL最基本的增删改查语句.在进行"增删改查"的操作之前,先建立一个包含数据表student的数据库,新建表grade(具体操作可以见上一篇). 一."增"-添加 ...

  8. 用户id生成规则_阿里/网易/美团/58用户画像中的ID体系建设

    前言 在<标签构建过程中,如何快速盘点业务及数据需求?>梳理完标签画像体系的业务需求后,索隆开始了对画像体系的整体设计,其中首要遇到的就是用户ID体系的打通相关的问题. 公司各业务线ID繁 ...

  9. 额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~...

    我修改了 main.xml 然后我在主函数中调用main里面的东西 例如在main.xml加了一个id 我在主函数用 R.id老是调用不出来 如何才能快速的准确的调用出 main.xml里面的东西呢? ...

最新文章

  1. 【数据结构】平衡树 - treap
  2. Lunar New Year and Cross Counting
  3. JavaSE基础知识(5)—面向对象(Object类)
  4. 用循环输出以下数列:斐波那契数列(要输出20个数字)_Python学习之“为女朋友解释hash是个什么东西”
  5. java socket 抓包_linux下用socket的抓包程序
  6. Angular4记账webApp练手项目之四(在Angular4项目中用echarts绘制图表)
  7. 从“流处理”到“流批一体”,Apache Flink 的19个企业最佳实践
  8. C# 实体映射,对象映射框架——Mapster
  9. 2020最全蓝牙耳机盘点:年会最值得选择的十大优秀蓝牙耳机品牌
  10. matlab与dsp程序,Matlab生成dsp程序——官方例程学习(4)
  11. Eplan教程——如何使用项目检查功能
  12. 51单片机c语言怎么定义引脚,80C51单片机引脚功能图解
  13. 20145322何志威《网络对抗》Exp2 后门原理与实践
  14. scroll案例:带有动画的返回顶部
  15. 小学英语之拯救小学生 V1.0 名词单复数变化规则
  16. 互联网协议 传输层及概述
  17. matlab ild,10GBASE-KR
  18. 输入法出现异常???输入英文字母分隔很大???你真的会使用输入法了吗???如何高效使用输入法???微软自带输入法切换
  19. 基于ROS下的安卓手机图像和IMU跑ORB-SLAM3
  20. Android播放视频快进帧预览图完美解決方案

热门文章

  1. 压力换算公斤单位换算_压力单位转换器_压力换算器 百分百好站
  2. HTML基础——图像标签(img标签)
  3. 【docker系列】docker深入浅出之安装教程
  4. 2021年秋招面试真题以及面试技巧分享
  5. Enolsoft PDF Converter with OCR Mac(PDF格式转换及OCR识别软件)
  6. SpringBoot单元测试的@RunWith与@SpringBootTest注解
  7. 【目标检测实验系列】使用yolov3 spp训练西工大遥感数据集NWPU VHR-10(包括如何将NWPU VHR-10转为VOC格式和yolov3 spp实验调试的详细步骤,且附上训练完的权重文件)
  8. pytorch无坑超详细图文CPU版小白安装教程(配gpu版链接、conda命令教程)
  9. 计算机科学与技术和工业设计,浙江大学计算机科学与技术学院柴春雷副教授带你逛工业设计专业...
  10. Matlab 画热力图(heat-map)