高并发系统架构设计之数据库篇09:分库分表后数据库ID的全局唯一性

本文探讨了在高并发系统中,分库分表后如何解决数据库ID的全局唯一性问题。文章指出,使用业务字段作为主键可能存在局限,建议使用生成的唯一ID。详细介绍了基于Snowflake算法的发号器服务,用于生成有序、全局唯一的ID,以替代UUID并避免其带来的问题。此外,还讨论了Snowflake算法的优缺点及其在实际项目中的应用和改造,强调理解原理并根据业务需求选择适合的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


引言

前面我们了解了分布式存储两个核心问题:数据冗余和数据分片,以及在传统关系型数据库中是如何解决的。当我们面临高并发的查询数据请求时,可以使用主从读写分离的方式,部署多个从库分摊读压力;当存储的数据量达到瓶颈时,我们可以将数据分片存储在多个节点上,降低单个存储节点的存储压力,此时我们的架构变成了下面这个样子:
在这里插入图片描述

你可以看到,我们通过分库分表和主从读写分离的方式解决了数据库的扩展性问题,但数据库在分库分表之后,我们在使用数据库时存在的许多限制,比方说查询的时候必须带着分区键;一些聚合类的查询(像是 count())性能较差,需要考虑使用计数器等其它的解决方案,其实分库分表还有一个问题就是主键的全局唯一性的问题。

一、数据库主键

数据库中的每一条记录都需要有一个唯一的标识,依据数据库的第二范式,数据库中每一个表中都需要有一个唯一的主键,其他数据元素和主键一一对应。那么关于主键的选择就成为一个关键点了,一般来讲,你有两种选择方式:

    1. 使用业务字段作为主键,比如说对于用户表来说,可以使用手机号,email 或者身份证号作为主键。
    1. 使用生成的唯一 ID 作为主键。

对于

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Freedom3568

技术域不存在英雄主义,不进则退

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值