分库分表全面总结

news/2025/12/1 15:30:34/文章来源:https://www.cnblogs.com/hellodeyang/p/19292974

目录
  • 分库分表全面总结
    • 分库分表的本质
    • 分库分表方式
      • 示例1:垂直分库(按业务拆分到不同数据库)
      • 示例2:垂直分表(按列拆分到不同表)
      • 示例3:水平分库(数据分布到不同数据库的同名表)
      • 示例4:水平分表(数据分布到同库的不同表)
    • 历史演进
    • 选择指南(超简单版)
    • 一句话记忆口诀
    • MySQL的分库分表和redis的分库分表
      • Redis简单分库分表实例
        • 方案一:最简分库(按业务隔离)
        • 方案二:最简单分表(按Key前缀+取模)

分库分表全面总结

分库分表的本质

分库分表是将单一数据库或表拆分为多个数据库或表,以提升系统性能的手段;分库分表主要用于解决单库单表数据量过大、并发压力高、存储瓶颈等问题

空间换时间:通过增加存储架构的复杂度,换取性能和扩展性的提升。

分库分表方式

image-20251201143252984

示例1:垂直分库(按业务拆分到不同数据库)

-- 原来的综合业务数据库
CREATE DATABASE ecommerce;USE ecommerce;
CREATE TABLE users (...);     -- 用户表
CREATE TABLE products (...);  -- 商品表
CREATE TABLE orders (...);    -- 订单表
CREATE TABLE payments (...);  -- 支付表
CREATE TABLE logs (...);      -- 日志表-- 垂直分库后
CREATE DATABASE user_db;      -- 用户相关数据库
USE user_db;
CREATE TABLE users (...);
CREATE TABLE user_profiles (...);CREATE DATABASE product_db;   -- 商品相关数据库
USE product_db;
CREATE TABLE products (...);
CREATE TABLE categories (...);CREATE DATABASE order_db;     -- 订单相关数据库
USE order_db;
CREATE TABLE orders (...);
CREATE TABLE order_items (...);

示例2:垂直分表(按列拆分到不同表)

-- 原来的用户大宽表
CREATE TABLE users (id BIGINT PRIMARY KEY,username VARCHAR(50),password VARCHAR(100),email VARCHAR(100),phone VARCHAR(20),address TEXT,avatar_url VARCHAR(200),bio TEXT,created_at DATETIME,updated_at DATETIME,last_login DATETIME,login_count INT
);-- 垂直分表后(热点冷数据分离)
-- 热点表:经常查询的字段
CREATE TABLE user_base (id BIGINT PRIMARY KEY,username VARCHAR(50),password VARCHAR(100),email VARCHAR(100),created_at DATETIME,updated_at DATETIME,INDEX idx_username (username),INDEX idx_email (email)
);-- 冷数据表:不常查询的字段
CREATE TABLE user_detail (user_id BIGINT PRIMARY KEY,phone VARCHAR(20),address TEXT,avatar_url VARCHAR(200),bio TEXT,last_login DATETIME,login_count INT
);

示例3:水平分库(数据分布到不同数据库的同名表)

-- 原来的单库单表
CREATE DATABASE main_db;
USE main_db;
CREATE TABLE orders (order_id BIGINT PRIMARY KEY,user_id BIGINT,amount DECIMAL(10,2),status VARCHAR(20)
);-- 水平分库后(按用户ID分库)
-- 数据库1(用户ID为偶数的订单)
CREATE DATABASE order_db_0;
USE order_db_0;
CREATE TABLE orders (...);  -- 存储user_id%2=0的订单-- 数据库2(用户ID为奇数的订单)
CREATE DATABASE order_db_1;
USE order_db_1;
CREATE TABLE orders (...);  -- 存储user_id%2=1的订单

示例4:水平分表(数据分布到同库的不同表)

-- 原来的单表
CREATE TABLE order_2023 (order_id BIGINT PRIMARY KEY,user_id BIGINT,amount DECIMAL(10,2),order_date DATE
);-- 水平分表后(按月分表)
CREATE TABLE order_202301 (...);  -- 2023年1月订单
CREATE TABLE order_202302 (...);  -- 2023年2月订单
CREATE TABLE order_202303 (...);  -- 2023年3月订单
-- ... 以此类推

历史演进

image-20251201144020942

实际案例:电商系统演进

# 阶段1:单库单表(初创期)
database: ecommerce
tables: - users- products- orders- payments- logs# 阶段2:读写分离(用户增长)
master: ecommerce_master
slaves:- ecommerce_slave1- ecommerce_slave2# 阶段3:垂直分库(业务复杂化)
databases:user_db:       # 用户服务tables: [users, user_profiles]product_db:    # 商品服务  tables: [products, categories, brands]order_db:      # 订单服务tables: [orders, order_items]payment_db:    # 支付服务tables: [payments, refunds]# 阶段4:水平分表(单表数据量大)
order_db:tables:- orders_0  # user_id%4=0- orders_1  # user_id%4=1  - orders_2  # user_id%4=2- orders_3  # user_id%4=3# 阶段5:水平分库分表(海量数据)
order_db_0:      # 数据库分片0tables: [orders_00, orders_01]
order_db_1:      # 数据库分片1tables: [orders_10, orders_11]

选择指南(超简单版)

问:业务模块太多,互相影响?
答:用【垂直分库】✅问:表字段太多,有的常用有的不常用?  
答:用【垂直分表】✅问:单张表数据太多,查询太慢?
答:用【水平分表】✅问:单个数据库服务器撑不住了?
答:用【水平分库】✅问:上面问题都有?
答:先垂直再水平,一步步来!

一句话记忆口诀

垂直分库:不同业务不同库(按功能分)
垂直分表:冷热字段分开存(按频率分)  
水平分表:数据太多分开放(按数据分)
水平分库:机器不够加机器(按机器分)

记住:垂直是"分类",水平是"分堆"

MySQL的分库分表和redis的分库分表

所有分库分表,无论MySQL还是Redis,终极目标就是:突破单机限制!

MySQL的"分库分表":是真的把数据库拆分成多个物理上独立的部分,每个部分都是完整的数据库实例。

Redis的"分库分表":是一个容易引起误解的说法。Redis的:

  • "分库"(SELECT 0-15)更像命名空间隔离

    额外知识点:

    Redis默认:1个实例 = 16个抽屉(0-15),不同抽屉的东西完全独立!就像是16个数据库。

    • Redis抽屉的实现原理 = 16个完全独立的dict哈希表 + 客户端db指针切换
    • 就像16个独立的HashMap,SELECT只是告诉Redis:"现在用第几个HashMap"

    如果不选:所有数据都默认放在第0个抽屉(db0)

    要换抽屉:用 select 数字 命令切换

  • "分表"(Cluster分片)是数据分布策略

它们只是恰巧用了相似的词汇,但解决的问题、实现方式、设计理念完全不同。

简单说:

  • MySQL分库分表:是"真刀真枪"的数据库拆分
  • Redis分库分表:是"巧立名目"的缓存隔离

Redis简单分库分表实例

方案一:最简分库(按业务隔离)

核心思想:存数据时,程序自己来判断放到对应的redis库里(这个库可以是不同的redis服务,也可以是同一个redis服务的"抽屉"(db=0 , 1 ,2...))

import redis# 创建不同业务的Redis连接
# 虽然物理上是一个Redis,但逻辑上用不同db号隔离# DB 0:用户缓存
user_redis = redis.Redis(host='localhost', port=6379, db=0) # 第0个抽屉# DB 1:商品缓存  
product_redis = redis.Redis(host='localhost', port=6379, db=1) # 第1个抽屉# DB 2:订单缓存
order_redis = redis.Redis(host='localhost', port=6379, db=2) # 第2个抽屉# 使用示例
# 存用户数据到DB 0
user_redis.set('user:1001', '张三')# 存商品数据到DB 1  
product_redis.set('product:2001', 'iPhone15')# 它们互不干扰
print(user_redis.get('product:2001'))  # None,因为DB 0里没有这个key
print(product_redis.get('product:2001'))  # b'iPhone15',在DB 1里# 可以单独清空某个业务
# user_redis.flushdb()  # 只清空用户缓存,不影响商品和订单

java实现

import redis.clients.jedis.Jedis;public class CorrectRedisSharding {public static void main(String[] args) {// 先创建连接,再select数据库Jedis userJedis = new Jedis("localhost", 6379, 2000);  // timeout=2000msuserJedis.select(0);  // 选择db0Jedis productJedis = new Jedis("localhost", 6379, 2000);productJedis.select(1);  // 选择db1// 使用userJedis.set("user:1001", "张三");productJedis.set("product:5001", "iPhone");System.out.println("用户数据: " + userJedis.get("user:1001"));System.out.println("商品数据: " + productJedis.get("product:5001"));userJedis.close();productJedis.close();}
}
方案二:最简单分表(按Key前缀+取模)

核心思想:存数据时,根据规则选择对应的Redis实例

Redis分表 = 存数据时根据规则选Redis + 取数据时用同样规则找回去

# 核心思想:存数据时,根据规则选择对应的Redis
# ↓ 规则计算
key = "user:1001" → 规则计算 → 选择 Redis实例2↓
# 存到对应的Redis
redis_2.set("user:1001", "张三的数据")# 取数据时,用同样的规则找回去
key = "user:1001" → 规则计算 → 还是 Redis实例2↓
redis_2.get("user:1001")  # 拿到数据!
import redis
import hashlib# 准备3个Redis实例(可以是3台服务器或3个端口)
redis_nodes = [redis.Redis(host='localhost', port=6379, db=0),  # 分片0redis.Redis(host='localhost', port=6380, db=0),  # 分片1  redis.Redis(host='localhost', port=6381, db=0),  # 分片2
]def get_shard(key, shard_count=3):"""计算key应该去哪个分片"""# 简单取模算法hash_value = hashlib.md5(key.encode()).hexdigest()shard_index = int(hash_value, 16) % shard_countreturn redis_nodes[shard_index]# 使用示例
# 存用户数据,自动分散到不同分片
users = [('user:1001', '张三'),('user:1002', '李四'), ('user:1003', '王五'),('user:1004', '赵六'),
]for user_id, name in users:shard = get_shard(user_id)  # 自动选择分片shard.set(user_id, name)print(f"{user_id} 存储到分片 {redis_nodes.index(shard)}")# 取数据时也要用同样的算法
user_id = 'user:1002'
shard = get_shard(user_id)
print(f"{user_id} 的数据是: {shard.get(user_id)}")

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

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

相关文章

2025年深圳品牌策划公司推荐排行榜:深圳品牌策划公司能整合

在企业品牌竞争白热化的当下,选择一家能整合资源、提供稳定优质服务的深圳品牌策划公司,成为众多企业突破增长瓶颈的关键。为帮助企业精准选型,我们从资源整合能力、服务稳定性、服务质量、客户口碑及案例落地效果五…

2025年中国十大网店代运营公司推荐:代运营哪家强?

本榜单依托产业带深度调研与工厂真实合作口碑,聚焦源头厂商电商痛点,筛选出十家能解决招人难、成本高、效果差的标杆代运营企业,为实体厂商选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:广东飞客网…

2025年户外橡胶地垫制造厂权威推荐榜单:减震橡胶地垫/公园橡胶地垫/复合橡胶地垫源头厂家精选

户外橡胶地垫作为公共空间安全防护与运动场地建设的重要材料,其市场需求持续增长。据行业统计,我国户外橡胶地垫市场规模年均增长率达12%以上,其中厚度20mm以上的高规格产品占比超过40%。本文基于产品质量、市场覆盖…

靠谱的国际短信验证码平台,短信验证码服务商盘点,兼顾速度、安全与成本控制!

在全球化日益加深的今天,国际短信验证码服务已成为企业拓展海外市场、提升用户体验的关键环节。从跨境电商到金融科技,从游戏出海到远程办公,高效、稳定、安全的短信验证码平台成为企业不可或缺的合作伙伴。根据QYR…

【JPCS出版 | EI检索】第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2025)

第七届机械工程与自动化国际学术会议(MEA 2025)将于2025年12月19日至21日在中国广州举行。【往届见刊后快至1个月检索、连续5年稳定EI检索、易中稿】 第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议…

这个代码有什么用

$ a.out test init=ok search=34/34 candidate_num=157 dec=34 py2=shijiwentiyaodaoshijicainengjiejue $ a.out read successfully, lemma num: 65101 spelling tree construct successfully. ... $ make g++ -g -…

2025年日字扣生产厂家权威推荐榜单:箱包塑料配件‌/塑料制品‌/塑胶扣具‌源头厂家精选

日字扣,虽只是箱包、户外装备上不起眼的小部件,却是决定产品使用便利性与耐用性的关键。据行业报告,2025年全球滑扣市场(包含日字扣等调节扣具)正稳健发展,其增长得益于箱包、户外及功能服装市场的持续需求。 在…

2025年磷酸铁回转窑生产厂家权威推荐榜单:回转窑干燥设备‌/磷酸铁锂回转窑‌/大豆渣回转窑干燥机‌源头厂家精选

在新能源与绿色制造浪潮推动下,回转窑作为处理磷酸铁、大豆渣等复杂物料的关键装备,其市场需求与技术迭代正同步加速。2025年,中国回转窑市场已达到19.32亿元人民币的规模,全球市场更是高达50.84亿元,且市场正持续…

JavaScript基础笔记碎片-对象、数组、Map与Set

注意:本篇学习笔记基于原网站: JavaScript教程 - 廖雪峰的官方网站 笔记仅作学习留档使用 本篇目录对象 循环 Map和Set iterable对象 let object ={...}表示一个对象,键值对 以xxx: xxx形式申明,,隔开。最后一个键…

java17版本,用IDEA开发,在JavaFX中无法找到com.google.gson。

java17版本,用IDEA开发,在JavaFX中无法找到com.google.gson。 切换版本为<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1…

2025手机配件到迪拜物流专线送仓TOP5权威推荐:甄选企业

中东跨境电商蓬勃发展,手机配件作为热门品类,年出口额超300亿元,但物流环节的痛点成为企业出海的大阻碍。据2024年行业调研,45%的手机配件出口企业因中东空运的头程延误、清关卡顿、末端派送失败,导致订单纠纷率高…

Visual Studio Code 轻量不简陋!VS Code:零基础编程者的第一款「万能编辑器」安装+中文设置步骤

简介 Visual Studio Code(简称 VS Code)是微软 2015 年 4 月在 Build 开发者大会发布的开源免费轻量级代码编辑器,它填补了普通文本编辑器和重型集成开发环境(IDE)之间的空白,如今已是全球多数开发者的首选工具,…

推荐几家海外展会推广公司,五家效果不错的海外展会营销推广平台详细介绍

随着 “一带一路” 倡议深入推进及 RCEP 区域合作深化,中国企业出海需求持续攀升。据中国会展经济研究院数据显示,2024 年中国境外自主办展总数达 216 个,增幅 13.68%,其中 78.24% 的展会布局在 “一带一路” 共建…

2025年12月AI 编程代码生成效率实战推荐:技术性能与应用场景的全面分析

在软件开发进入AI驱动的全新阶段,AI编程工具已成为提升开发者效率的核心要素。据IDC预测,2025年全球AI开发者工具和平台支出将达到224亿美元,年复合增长率高达24.8%;同时,Stack Overflow 2024年度开发者调查显示,…

开源高性能IM+集成AI能力,基于SpringBoot +Tauri+Vue 3+TypeScript支持全平台与丰富会话模式

开源高性能IM+集成AI能力,基于SpringBoot +Tauri+Vue 3+TypeScript支持全平台与丰富会话模式 天若源码教程实战2025年11月27日 07:00 湖南 点击“蓝色字”,关注我们哦!!一、平台介绍在某次兼职项目中,我受其他公司…

数字屋打包流程

打包流程 一、珍藏版打包:纸盒(外包装):打包 五件套准备工作: 向日葵+指路牌、激活卡、折光板、草地、干燥剂草地装入小袋 向日葵+指路牌贴双面贴,装入小袋 折光板贴双面贴每个产品放配件: 五件套、木底座、包黄…

2025年食用油脂企业性价比与满意度排名:油一堂食品性价比好

在餐饮行业竞争白热化的当下,后厨用油的品质、成本与稳定性直接影响菜品口感、品牌口碑与利润空间。自熬油的繁琐低效、成本高企,以及市售油品的品质参差不齐,让无数餐饮老板与家庭主妇陷入选择困境。2025年,哪些食…

2025年进口无硫纸厂家权威推荐榜单:防潮纸/硅片间隔纸/丝印白纸源头供应商精选

随着全球对食品安全、电子精密制造及医药包装标准的日益严苛,无硫纸作为一种关键的特种包装材料,其市场需求持续增长。据相关行业分析,特种纸市场年复合增长率稳定,其中环保型、功能型包装纸品是主要增长驱动力。进…