news 2026/7/15 1:52:08

分库分表实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分库分表实战

为什么

分表:解决单表数据量过大,查询性能下降,ddl困难问题

分库:解决单库连接数不足,写并发高,通过分摊压力提高吞吐量,单机瓶颈。

问题

引入了分布式复杂性

方式

垂直分库分表

按照业务模块拆分库

按列拆分表

水平分库分表

按行拆分,解决单表过大问题,应对大数据量核心手段

分片键

怎么选?

查询频率高的

路由算法

范围分片

按照id或时间分。扩容,查询方便

缺点,容易数据倾斜

哈希取模

分片键哈希取模,数据分布均匀

缺点,扩容困难,需要迁移数据

一致性哈希

解决扩容问题,节点变化前只需迁移少量数据。

缺点,实现复杂,存在哈希倾斜风险

分库分表数量为什么是2的幂次方

和hashMap是一个道理。

  • 位运算优化:hash % 8 等价于 hash & (8-1),性能更高。
  • 均匀分配:便于将表均匀分配到多个库中。
  • 易于扩容:从N张表扩容到2N张表时,只需迁移一半数据。利用了“高位运算”:因为容量永远是 2 的幂,扩容时只需看 hash 值新增的那一位高位是 0 还是 1。是 0 就留在原索引(低位),是 1 就迁移到 原索引 + 旧容量(高位)。

分布式ID

雪花算法,redis自增(挂了怎么办?)

跨库JOIN

  • 常用字段冗余
  • 全局表:每个库存一份变动少基础表(配置)。本地join
  • 应用层组装,查好数据在内存中组装
  • 相关联的数据,强制放在一个节点。比如订单和订单详情,相同的订单,数据要放在同一个节点。

分布式事务如何处理?

比如强一致性的二阶段提交。但是不建议使用,因为性能差。

最终一致性,比如tcc和saga。 Tcc比较复杂,每种事务都要实现三个方法 Try ,confirm和cancel。本地消息表加重试,或者rocket mq事务消息。

非分片键如何查询?

一,建立映射表,非分片键和分片键,建立映射表

二,异构索引,根据另一个维度,再建立一套分库分表。

三,基因法,将分片信息植入到id中。比如订单表和用户id。订单号包含用户id分片信息。

生成订单号的时候,可以将用户id生成二进制,然后放到订单号的尾部。查询的时候解析出来即可。

或者是生成雪花id的时候,专门划分几位,保存库表编号。

基因法的一个优点就是不用去查映射表,也不用去配置中心拉取路由规则,计算路由。速度会很快,就是单纯的位运算。那他的一个缺点也很明显,就是灵活性很差,比如说我一个节点挂了,或者发生数据倾斜,或者是要扩容,迁移数据的时候,就没有办法使用。

这里一个解决方案就是可以兜底,使用映射覆盖,就是在中间件层设置一个优先级更高的热迁移配置。如果有设置配置,那么就去读取配置强制使用配置中的路由,否则就使用id中的路由。

如何设计?

当查询遇到分页怎么办?

先查出来,然后再在内存中聚合。但是性能比较差。尽量能不分页就不分页,或者使用es。

如何设计动态扩容方案

一,停机扩容,但是不推荐,数量大的时候会很慢。

二,一次性规划好,预分配。一次性就设计好,32个库,每个库32张表,一共是1024张表。够用好久,避免扩容迁移数据。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 5:10:38

SQLModel零基础教程(五)- 工程化封装 迁移工具

这里写目录标题前言一、阶段学习目标二、第一部分:工程化分层封装(企业标准项目结构)2.1 标准项目目录2.2 步骤1:多环境配置 pydantic-settings2.2.1 .env 开发配置文件2.2.2 config/settings.py 配置模型2.3 步骤2:全…

作者头像 李华
网站建设 2026/7/14 20:39:30

FluxDown:替代IDM的免费下载器

今天推荐的这款工具叫 FluxDown,开源免费下载工具。对不少用惯了迅雷、IDM 的用户来说,这款软件在协议支持和隐私方面有一些不同的思路。download:https://pan.quark.cn/s/c43311026084磁力链接下载磁力链是 BT 下载的常见形式。它原生支持 B…

作者头像 李华
网站建设 2026/7/13 5:10:41

PCB 新手 18 类常见错误汇总

一、焊盘与器件封装类(1、2、8、12) 1. 焊盘孔径与引脚不匹配 错误:孔径和元器件引脚直径完全相等,插件引脚塞不进、焊接难上锡 正确:孔径比引脚大 0.2~0.3mm,预留装配与焊锡浸润空间 举例:0.8mm 引脚连接器,焊孔只开 0.8mm 属于错误;开 1.0~1.1mm 为标准做法 2. 原理…

作者头像 李华
网站建设 2026/7/13 5:10:57

OpenGL学习笔记-04-着色器-基础说明

着色器 本质:一段运行在显卡(GPU)上的小程序。作用:告诉GPU“每个顶点应该放在哪里”和“每个像素应该显示什么颜色”分类:顶点着色器、几何着色器、片段着色器 顶点着色器 作用:告诉GPU,每个顶…

作者头像 李华
网站建设 2026/7/13 5:10:59

SQL注入漏洞实战:从手工注入到参数化查询修复

1. 项目概述:一次典型的Web应用安全实战最近在整理一些老旧的Web应用系统漏洞案例,发现很多开发者对SQL注入这类“古典”漏洞的防范意识依然不足。今天我们就来深入复现一个典型的案例:某微商城系统的goods.php文件存在的SQL注入漏洞。这个案…

作者头像 李华
网站建设 2026/7/13 5:10:56

TI TPIC7710EVM评估模块:汽车EPB系统ASIC驱动与电机控制实战解析

1. 项目概述与核心价值如果你正在开发汽车电子驻车制动(EPB)系统,或者对高集成度电机驱动ASIC的评估感兴趣,那么德州仪器(TI)的TPIC7710EVM评估模块绝对是一个绕不开的利器。我最近在做一个EPB控制单元的原…

作者头像 李华