Go 服务开发高手课
15
15
1.0x
00:00/00:00
登录|注册

11|数据库:分库分表,没有用户id怎么分?

你好,我是徐逸。
通过前面的课程学习,我们已经了解了如何从编码和框架这两个层面来优化服务性能。不过呢,当性能瓶颈点是下游数据库时,这两个层面的优化就无能为力了。
对于数据库性能的优化,除了合理使用索引等使用细节上的优化之外,在高并发场景,我们还需要在架构层面进行优化。
今天我们就来聊聊,在高并发读写场景,如何从架构层面来优化数据库的读写性能。

案例准备

为了让你更加身临其境,我会以一个实践中的案例为基础,带你通过一步步演化数据库架构,来实现高并发读写数据库的目标。
作为用户,想必你使用过类似微信“附近的人”这样的产品功能。对于这样的产品功能,它的内部是如何实现的呢?
图1 附近的人
从服务端的角度出发,为了实现这个产品功能,服务端通常需要提供下面这两个功能接口。
第一个是写入接口。在用户打开页面时,客户端将调用此接口,用以上传用户所处位置的相关信息。
第二个是查询接口。当用户打开页面后,客户端会调用此接口,根据用户当下的位置信息,检索在一定时间内出现在其附近的其他用户。
从服务端内部实现的角度,对于位置数据的存储和检索,我们可以用 MongoDB 数据库来实现。
假如现在我们构建了一个基于 MongoDB 数据库的 “附近的人” 服务,它采用的是单库单表的数据库架构设计,核心实现逻辑如下。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 数据库性能优化需要在架构层面进行优化,特别是在高并发读写场景下。 2. 通过读写分离架构优化,可以通过扩充从库来增加数据库集群可承载的读QPS上限。 3. 主从同步操作会消耗主库的硬件资源,从库数量受限,需要确保单库的读QPS上限不至于过低。 4. 表里数据的行数是影响单库读QPS上限的重要因素,单表数据行数过多会影响数据库可承载QPS并导致请求延时。 5. 数据库分表是解决单表数据行数过多导致读性能下降的一种方案,常见的分表规则包括范围路由、hash路由和配置路由。 6. 分表架构可以根据数据量和业务需求,采用不同的分表规则来提升表数据查询的性能。 7. 分库架构是针对高TPS写操作的一种解决方案,通过拆分数据库构建多个主库,将写请求分散到不同的主库中,从而提升整个数据库集群的写TPS上限。 8. 读写分离和分库分表架构是在高并发数据库读写场景下进行优化的重要架构知识。 9. MySQL表行数超过2000w左右会被认为是大表,需要做拆分,这个数值是根据实际经验和性能测试得出的。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 服务开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)