IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 数据库自增ID会一直自增下去嘛? -> 正文阅读

[大数据]数据库自增ID会一直自增下去嘛?

首先来回答这个问题,不会一直自增下去。

首先,我们得知道主键其实分为两类,第一类就是自己定义的主键,第二类就是系统为我们自动创建的主键。

先看第一类,也就是我们自己显示定义的自增长主键,像下面这样

id int NOT NULL AUTO_INCREMENT
PRIMARY KEY (id)

这里我们以int类型来说,int的最大值为21亿左右(2^31-1),假设自增初始值从0开始计算,增量为1,0、1、2、3、4...,对于小型业务来说,大概率是达不到21亿的,但是对稍微大一点的业务来说,是比较容易达到21亿的。也就是说,这个主键已经封顶了,它已经达到了int的最大值,那么继续往里面插入数据会怎么样呢?

我可以很负责任的告诉你,会出bug,意思就是插入不进去了。你们可以去自己的电脑上试一试。其实出bug也很好理解,第一,这个类型已经达到了int的最大值了;第二,主键是不允许重复的。

你以为这就完了?并没有哦,还有一种就是我们并没有显示定义为主键,但它在系统中会认为是主键(前提是我们在这张表中没有定义主键)。它是谁呢?不卖关子了,它就是在某个列上加了唯一约束UNIQUE并且不允许为NULL(因为它具有唯一性),也就是像下面这样

id int UNIQUE NOT NULL

这个时候系统会把这个列当成主键了。

那遇到这一类情况该怎么办呢?其实也蛮好解决的,就把类型给扩大呗,把int改成bigint(8个字节),这个时候数据已经很大了,封顶的可能性很低,几乎为0。

接下来我们来看第二类,也就是当我们没有自定义主键和没有定义唯一约束UNIQUE并且不允许为NULL的列,这个时候系统会为我们创建一个主键ROW_ID,其实这也不能叫创建的,而是它原本就在,它属于隐藏列。稍微扩展一下,Mysql会为每张表默认添加一些列(也称为隐藏列),分别为:row_id、tr_id和roll_pointer,如果你想深入的了解,推荐去阅读相关书籍。回到主题,就是在我们我们没有自定义主键和没有定义唯一约束UNIQUE并且不允许为NULL的列时,系统会为我们创建一个主键,它就是row_id,默认值从0开始增长,但是也有范围哦,它为6个字节,最大值为2^48-1,也就是281474976710655,大概为281万亿左右,是不是发现数据很大,的确很大,但是相对于上面的8个字节的bigint还是差了蛮多的。那么当它要超出范围时,是不是也和上面一样会报错呢?

其实是不会的,大家可以去测试一下。那结果会如何呢?我先给你看它增长的规律:id = (id + 1)% 2^48,有没有发现什么呢,相信聪明的你肯定发现了其中的奥秘。对了,就是你想的那样,它是一个环(好比:0、1、2、0、1...),当要超出范围时,它会覆盖前面的数据,那这可是不能接受的哦(其实还是要看业务量)。

综上所述,最好的办法还是我们显示的定义主键而且主键尽量使用bigint类型(其实这一切的一切还得看业务量,之所以这样子说,是因为如果我们的业务量只是万级别的,那我们还要考虑这些问题嘛,其实压根没有必要考虑这些的)。

希望上面我的分享对你有所帮助,谢谢!

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:37:17  更:2022-07-21 21:39:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:50:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码