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)取模去查(路由)到具体那张表