大厂为什么要禁止使用数据库自增主键

大表为何不能用自增主键?

数据库自增主键,以mysql为例,设置表的ID列为自动递增,便可以在插入数据时,ID字段值自动从1开始自动增长,不需要人为干预。

在小公司,或者自己做项目时,设置ID为自动递增,是没有问题的。但是在分布式系统中,自增主键会带来问题,下面举例说明:

有一张商品信息表,表中有3亿条数据,但是3亿条数据是分布在3个数据库中(3个表分片)。前1亿条数据分布在分片1中;中间1亿条数据,分布在分片2;最后1亿条数据分布在分片3中。

问题1:如果单条数据量比较小,在分片1中实际可以容纳1.5亿数据,就无法再进行数据扩展了,因为数据是按照ID范围进行分片的,ID是固定死的,无法在运行期间,进行动态扩展。

问题2:自增主键是数据库层面生成的自增序列,数据库集群只能采用“范围分片”的形式,也就是提前规划好每个分片存储的记录ID。此操作会产生“尾部热点”。

何为尾部热点,在使用范围分片的情况下,测试程序的生成主键是单调递增的,所以新写入的数据往往集中在一个 范围范围内,而范围又是数据调度的最小单位,只能存在于单节点,那么这时集群就退化成单机的写入性能,不能充分利用分布式读写的扩展优势了。当所有写操作都集中在集群的一个节点时,就出现了我们常说的数据访问热点(Hotspot)。

以上面的商品表为例,当数据量达到2.5亿时,数据再进行插入操作时,数据都会进入到分片3中,也就是集中会对分片3这个数据库进行操作,前面两个数据库(分片1、分片2),几乎没有压力。

AB两个数据库,分别采用范围分片和Hash分片的方法,做数据并发处理。可以看到Hash分片的方式效率远高于范围分片看,提高大约2倍。

Hash分片处理效率高,原因是Hash分片不是把数据只写在一个切片上,它是根据ID取模,然后均匀分配在各个切片上,相当于让把压力分摊到各个切片上。

UUID是好的替代方案吗?

如果说自增主键不适用于大数据量分库的表设计,那么是否可以用UUID或者GUID来替代自增主键呢?其实UUID也是不合适的。

UUID是根据当前计算机的时间和其他各种属性计算出来的一个128位长度的字符串,字符串的特点是唯一且无序。

既然是唯一的,那为何不适合作为主键,那就看MySQL的机制。因为UUID是无序的,作为主键会涉及大量索引重排。作为主键,当数据生成时,就自动建立唯一的主键索引。

数据采用B+树的方式进行数据存储,叶子节点按照顺序,1234...进行排列,当要插入一条新数据时,只需要在原有的节点上追加上一个元素,并调整结尾的树形结构。影响的数据范围非常小。

如果使用UUID,就会涉及到索引重排,索引重排以下图为例:

索引重排示意图

当新的数据插入时,整个数据结构都会发生变化。当数据量大时,代价是很大的。

为了解决该问题,也就有了一种分布式且有序的主键生成算法,即雪花算法。

SnowFlake雪花算法是什么?

雪花算法(SnowFlake)是Twitter公司分布式项目采用的ID 生成算法。

雪花算法构成要素

雪花算法构成说明

以时间为依据,结合机器ID及序列,生成的一个定长的数字,这个数字就可以作为主键。它即可以保证是有序的,在分布式情况下,每个分片也是唯一的。 

使用雪花算法时,需要注意时间回拨带来了ID重复问题,也就是如果把服务器时间往回调整,那么生成的值,有可能与之前的值重复。一般不会去随意调整服务器时间,这个问题产生的概率不高。

关于雪花算法的其他内容,参考文章:

SQL-雪花ID算法-全局唯一标识符(GUID)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/898664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ollama 离线安装

1. 查看服务器CPU的型号 ## 查看Linux系统CPU型号命令,我的服务器cpu型号是x86_64 lscpu 2. 根据CPU型号下载Ollama安装包,并保存到/home/Ollama目录 我下载的是Ollama的v0.1.31版本,后面均以此版本为例说明 下载地址 https://github.…

拴柱说Mac之Mac的高效使用技巧第三期

Mac的设计有着非常多的使用技巧,这些技巧能够极大的提高你的使用效率,但是还是有许多人并不知道,那么今天Mac高效使用技巧分享第三期来了 Mac有一个独特的设置,那就触发角,触发角有着非常多的妙用 在 “系统偏好设置…

为什么计算机科学存在图灵机和Lambda演算两种世界观,而量子力学却存在三种世界图景?

计算机科学存在两种基本的世界观:图灵机和Lambda演算,它们指出了到达图灵完备的两条技术路线。但是量子力学中却存在着三种世界图景:薛定谔图景,海森堡图景和狄拉克图景。为什么计算机科学有两种基本世界观,但是量子力…

【Python数据可视化】利用Matplotlib绘制美丽图表!

【Python数据可视化】利用Matplotlib绘制美丽图表! 数据可视化是数据分析过程中的重要步骤,它能直观地展示数据的趋势、分布和相关性,帮助我们做出明智的决策。在 Python 中,Matplotlib 是最常用的可视化库之一,它功能…

Netty-TCP服务端粘包、拆包问题(两种格式)

前言 最近公司搞了个小业务,需要使用TCP协议,我这边负责服务端。客户端是某个设备,客户端传参格式、包头包尾等都是固定的,不可改变,而且还有个蓝牙传感器,透传数据到这个设备,然后通过这个设备…

使用ORDER BY排序

在一个不明确的查询结果中排序返回的行。ORDER BY子句用于排序。如果使用了ORDER BY子句,它必须位于SQL语句的最后。 SELECT语句的执行顺序如下: 1.FROM子句 2.WHERE子句 3.SELECT子句 4.ORDER BY子句 示例一:查询employees表中的所有雇…

通俗易懂的入门 Axure RP文章 ,速学

目录 1. Axure RP简介? 2. Axure RP基本操作 (1)入门理解 (2)插入形状 (3)位置对齐、 (4)资源库 3. Axure RP基本交互 (1)切换不同的页面 …

进程间通信大总结Linux

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 用fork来共享管道原理 站在文件描述符角度-深度理解管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中,我们将一起深入了解K8s权限维持的攻击手法,通过研究这些攻击手法的技术细节,来更好地认识K8s权限维持所带来的安全风险。 在这个课程中,我们将学习以下内容: K8s权限维持:简单介绍K8s权限维持…

UG2312软件安装教程+Siemens NX三维建模中文安装包下载

一、软件下载 【软件名称】:UG 2312 【支持系统】:win10/win11 【百度网盘】: https://pan.baidu.com/s/1oF-X29m1f5pDhElwi0rK8A?pwd70zi 二、UG NX软件 UG(Unigraphics NX)是一款集 CAD、CAM、CAE 于一体的高效…

大范围实景三维智能调色 | 模方自动化匀色解决方案

《实景三维中国建设总体实施方案(2023—2025年)》、《实景三维中国建设技术大纲》等相关文件中指出,倾斜Mesh三维模型修饰要求模型整体色彩真实,无明显色差。9月,自然资源部在国务院新闻发布会上表示,实景三…

Linux:线程及其控制

我们已经学了线程的创建&#xff0c;现在要学习线程的控制 线程等待 我们来先写一个没有线程等待的代码&#xff1a; pthcon.c: #include<stdio.h> #include<pthread.h> void* gopthread(void* arg){while(1){printf("pthread is running\n");sleep(1…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

SpringBoot实现微信支付接口调用及回调函数(商户参数获取)

#1024程序员节 | 征文 # 一、具体业务流程 1. 用户下单 - 前端操作&#xff1a; - 用户在应用中选择商品、填写订单信息&#xff08;如地址、联系方式等&#xff09;&#xff0c;并点击“下单”按钮。 - 前端将订单信息&#xff08;商品ID、数量、价格等&#xff09;发送…

Pytorch 实现图片分类

CNN 网络适用于图片识别&#xff0c;卷积神经网络主要用于图片的处理识别。卷积神经网络&#xff0c;包括一下几部分&#xff0c;输入层、卷积层、池化层、全链接层和输出层。 使用 CIFAR-10 进行训练&#xff0c; CIFAR-10 中图片尺寸为 32 * 32。卷积层通过卷积核移动进行计…

C++ —— map系列的使用

目录 1. map和multimap参考文档 2. map类的介绍 3. pair 4. map的增删查 4.1 插入 4.2 删除 4.3 查找 5. map的数据修改 6. map的operator[] 7. multimap和map的差异 1. map和multimap参考文档 - C Referencehttps://legacy.cplusplus.com/reference/map/ 2. map类的…

04 springboot-工程搭建案例(多环境部署,数据源, Swagger, 国际化,工具类)

项目搭建模板(多环境切换) springboot系列&#xff0c;最近持续更新中&#xff0c;如需要请关注 如果你觉得我分享的内容或者我的努力对你有帮助&#xff0c;或者你只是想表达对我的支持和鼓励&#xff0c;请考虑给我点赞、评论、收藏。您的鼓励是我前进的动力&#xff0c;让我…

基于CRNN模型的多位数字序列识别的应用【代码+数据集+python环境+GUI系统】

基于CRNN模型的多位数字序列识别的应用【代码数据集python环境GUI系统】 基于CRNN模型的多位数字序列识别的应用【代码数据集python环境GUI系统】 背景意义 多位手写数字识别&#xff0c;即计算机从纸张文档、照片、触摸屏等来源接收并解释可理解的手写数字输入的能力。 随着…

2024软件测试面试秘籍(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师…

低代码可视化-uniapp海报可视化设计-代码生成

在uni-app中&#xff0c;海报生成器通常是通过集成特定的插件或组件来实现的&#xff0c;这些插件或组件提供了生成海报所需的功能和灵活性。我们采用了lime-painter海报组件。lime-painter是一款canvas海报组件&#xff0c;可以更轻松地生成海报。它支持通过JSON及Template的方…