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

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

数据库自增主键,以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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫基础--requests模块

1、requests模块的认识 requests模块的认识请跳转到 requests请求库使用_使用requests库-CSDN博客 2、爬取数据 这里我们以b站动漫追番人数为例。 首先进去b站官网 鼠标右键点击检查或者键盘的F12,进入开发者模式。(这里我使用的是谷歌浏览器为例&#…

二分查找_ x 的平方根搜索插入位置山脉数组的峰顶索引

x 的平方根 在0~X中肯定有数的平方大于X&#xff0c;这是肯定的。我们需要从中找出一个数的平方最接近X且不大于X。0~X递增&#xff0c;它们的平方也是递增的&#xff0c;这样我们就可以用二分查找。 我们找出的数的平方是<或者恰好X&#xff0c;所以把0~X的平方分为<X …

Elasticsearch是做什么的?

初识elasticsearch 官方网站&#xff1a;Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic Elasticsearch是做什么的&#xff1f; Elasticsearch 是一个分布式搜索和分析引擎&#xff0c;专门用于处理大规模数据的实时搜索、分析和存储。它基于 Apache Lucene …

文言文编程,没错,尤雨溪都点赞了

文言文编程&#xff0c;没错&#xff0c;尤雨溪都点赞了 在现代编程语言百花齐放的今天&#xff0c;居然有人选择用古典汉语来写代码&#xff1f;这就是文言编程语言 Wenyan-lang&#xff0c;一种让你在写代码时&#xff0c;仿佛重回古代&#xff0c;挥毫泼墨般潇洒。本文将带你…

Ubuntu22.04安装RTX3080

Ubuntu22.04安装RTX3080 1 安装基础环境 更新依赖包 sudo apt-get update sudo apt-get upgrade2 安装驱动 &#xff08;1&#xff09;查看适合的显卡驱动 # 查看可用的驱动 sudo ubuntu-drivers devices# 返回值&#xff0c;推荐版本&#xff1a;nvidia-driver-550 ERROR…

提升C#异步性能:如何正确使用ConfigureAwait(false)避免上下文捕获

前言 在C#开发中&#xff0c;异步编程非常普遍&#xff0c;async/await模式极大地简化了异步任务的编写。然而&#xff0c;随之而来的是一些隐蔽的性能和上下文切换问题。在某些情况下&#xff0c;默认的上下文捕获行为可能会导致性能损耗&#xff0c;特别是在UI应用中&#x…

步骤详解:弹性公网ipv6如何申请?

弹性公网ipv6如何申请&#xff1f;申请弹性公网IPv6的步骤包括&#xff1a;首先登录私有网络控制台&#xff0c;选择弹性网卡并进入实例详情页。在IPv6地址管理标签页中分配IPv6地址&#xff0c;然后通过操作栏下的按钮释放或调整IPv6地址的公网访问能力。最后&#xff0c;配置…

python之爬取豆瓣排行与可视化

找到目标网址&#xff1a; url "https://movie.douban.com/chart" 豆瓣电影排行榜 鼠标右键&#xff0c;检查 复制url,与user-agent: url "https://movie.douban.com/chart" headers {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Wi…

SQL进阶技巧:如何找出开会时间有重叠的会议室?| 时间区间重叠问题

目录 0 场景描述 1 数据准备 2 问题分析 方法1:利用 lateral view posexplode()函数将表展开成时间明细表 方法2:利用数学区间讨论思想求解 3 小结 0 场景描述 有7个会议室,每个会议室每天都有人开会,某一天的开会时间如下: 查询出开会时间有重叠的是哪几个会议室?…

算法专题七: 分治归并

目录 1. 排序数组2. 交易逆序对的总数3. 计算右侧小于当前元素的个数4. 翻转对 1. 排序数组 算法思路: 本道题使用归并的思路进行排序, 先讲数组分为左右两个区间, 然后合并两个有序数组. class Solution {vector<int> tmp; public:vector<int> sortArray(vector&…

sentinel原理源码分析系列(五)-构建调用链路

上节分析构建插槽链&#xff0c;Sentinel的资源调用好比一个个连续的检查口&#xff0c;能否通过&#xff0c;使用检查规则和统计指标&#xff0c;本章开始分析插槽&#xff0c;首先分析构建调用链路的两个插槽 构建调用链路 构建调用链路为指标统计搭建好结构&#xff0c;调…

文件误删并清空回收站:全面解析与高效恢复策略

一、文件误删并清空回收站的遭遇 在日常使用电脑或移动设备的过程中&#xff0c;我们难免会遇到一些令人懊恼的数据丢失问题&#xff0c;其中文件误删并清空回收站便是最为常见的一种。当你不小心删除了某个重要文件&#xff0c;并且随后又毫不留情地清空了回收站&#xff0c;…

双十一母婴必买清单 推荐超实用母婴用品

随着双十一购物狂欢节的临近&#xff0c;无数准父母和年轻家长开始摩拳擦掌&#xff0c;准备为家中的小宝贝抢购一系列高品质、实用的母婴用品。在这个年度最大的电商促销活动中&#xff0c;选择对的产品不仅能够节省开支&#xff0c;更能确保宝宝的健康成长与舒适生活。以下是…

【C++ STL 模板类】pair 键值对

文章目录 【 1. pair 对象的创建 】【 2. pair 对象的赋值 】【 3. pair 对象的比较 】【 4. pair对象成员的互换】 C STL 标准库提供了 pair 类模板&#xff0c;专门用来将 2 个普通元素 first 和 second&#xff08;可以是 C 基本数据类型、结构体、类自定的类型&#xff09;…

中安未来 OCR:开启高效身份证件识别新时代

在数字化快速发展的今天&#xff0c;高效准确地处理各类信息变得至关重要。中安未来 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术以其卓越的性能和广泛的应用场景&#xff0c;成为了众多企业和机构的得力助手。其中&#xff0c;身份…

480p 720p 1080p 2k 4k 8k 12k分辨率视频分别占用多大带宽?

技术背景 好多开发者&#xff0c;在设置视频编码参数的时候&#xff0c;对不同分辨率的带宽设置&#xff0c;缺乏相关的经验&#xff0c;实际上&#xff0c;视频分辨率与所需带宽之间的关系受到多个因素的影响&#xff0c;包括视频编码方式、帧率、视频内容的动态程度等。下面…

SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao默认安装ngi…

5G工业路由器智能电网部署实录:一天内解决供电、网络

凌晨4:13,我被手机震动惊醒。变电站值班人员发来紧急消息:昨晚部署的SR800突然离线。我立即查看了STAR Device Manager平台,确认是设备A37号在3:47分失去连接。(key-iot.com/iotlist/sr800-3.html) 6:30到达变电站。检查SR800状态,发现是供电问题导致设备重启。这个老旧变电站…

Docker 安装使用

1. 下载 下载地址&#xff1a;Index of linux/static/stable/x86_64/ 下载好后&#xff0c;将文件docker-18.06.3-ce.tgz用WinSCP等工具&#xff0c;上传到不能外网的linux系统服务器 2. 安装 解压后的文件夹docker中文件如下所示&#xff1a; 将docker中的全部文件&#xff…

Gstreamer的webrtcbin插件

1、输入参数 static GOptionEntry entries[] {{"peer-id", 0, 0, G_OPTION_ARG_STRING, &peer_id, "String ID of the peer to connect to", "ID"},{"server", 0, 0, G_OPTION_ARG_STRING, &server_url, "Signalling se…