数据库水平扩展——分表分库
作者:互联网
注意点:无论按哪个纬度分表,订单号需要全局唯一,且需要包含库id和表id,以便定位。或者建一张订单号与分表纬度之间的关联表,并加载到缓存中。
此处以餐饮系统为例:按shopid分表
水平分表分库的方式一般有三种:
- 按范围分表,比如:shopid在1到1w的放在0表,shopid在1w1到2w的放在表1
优点:易于扩展
缺点:数据分散不均匀,容易出现单表瓶颈
- hash分表(硬hash),比如:
-
库名称定位:用户id末尾4位 Mod 32。
Mod表示除以一个数后,取余下的数。比如除以32后,余下8,余数就是8。代码符号是用%表示:15%4=3。
-
表名称定位:(用户id末尾4位 Dev 32) Mod 32。
Dev表示除以一个数,取结果的整数。比如得到结果是25.6,取整就是25。代码用/来表示:$get_int = floor(15/4)。15除以4,是一个小数3.75,向下取整就是3。一定是向下取整,向上取整就变成了4了。
优点:数据分散均匀
缺点:不易扩展,扩展需要做数据迁移。
特点:hash环、虚拟节点
这种情况是指销售平台上既有分买家又分买家
既需要根据userid查也需要根据shopid查
建冗余表,按用户id分表,再通过中间件异步按买家id分表。
原因:满足两个纬度的查询要求
qq_16399457 发布了24 篇原创文章 · 获赞 0 · 访问量 145 私信 关注标签:分库,hash,32,数据库,shopid,取整,分表,id 来源: https://blog.csdn.net/qq_16399457/article/details/103951398