mysql分库分表

视频地址

1.分库

水平分库-水平拆分:每个库结构是一样的

根据userId或者业务id取模\hash\range,如果取模结果为1落到第一个库,如果取模为0落到第二个库

垂直分库

每个库结构不一样,根据业务拆分,库1存核心业务数据,库2存其他非核心数据(字典、配置),库1+库2的总量

1.分表

水平分表:

根据userId取模 userId % 2(根据表的个数来) = 0,结果为0放到第1张表,结果为2放到第2张表

垂直分表:

冷热分离,热点数据和非热点数据放不同的表,并使用关联字段

工具jar包:Sharding-jdbc (维护成败低,升级麻烦) ,我们写的sql是查一张表,Sharding会自动帮我们转义,拼成两张表去查,然后取并集union(去重)
Mycat 第三方平台:也是转义sql、路由到指定的表,代码实现简单,需要单独搭建服务

尽量用 union all 代替 union

union 和 union all 的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all 的前提条件是两个结果集没有重复数据。

怎么分库分表?

1.索引表法、映射表法

非拆分的key怎么做查询?已经根据userId做了拆分,但是现在用username查的
需要加一张映射表,通过映射表根据username查到userId,然后再用userId取模%去查询,或者将映射数据放到缓存中,需要防止缓存穿透(利用查询数据库不存在的数据,布隆过滤器)

基因法(推荐)

写入时,通过username生成4位bit(1010),法生成userId=777,然后得到userId二进制(0011 0000 1001),在尾部拼上username生成的4bit基因(1010 => 转换为十进制为10,故存到第10张表)
读数据时,通过username的最后的4bit(1010)取模去查(路由)到具体那张表
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值