数据库水平扩展——分表分库

注意点:无论按哪个纬度分表,订单号需要全局唯一,且需要包含库id和表id,以便定位。或者建一张订单号与分表纬度之间的关联表,并加载到缓存中。

此处以餐饮系统为例:按shopid分表

水平分表分库的方式一般有三种:

  1. 按范围分表,比如:shopid在1到1w的放在0表,shopid在1w1到2w的放在表1

优点:易于扩展
缺点:数据分散不均匀,容易出现单表瓶颈

  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了。

优点:数据分散均匀
缺点:不易扩展,扩展需要做数据迁移。

  1. 一致性hash

特点:hash环、虚拟节点


这种情况是指销售平台上既有分买家又分买家

既需要根据userid查也需要根据shopid查

建冗余表,按用户id分表,再通过中间件异步按买家id分表。

原因:满足两个纬度的查询要求

发布了24 篇原创文章 · 获赞 0 · 访问量 136

猜你喜欢

转载自blog.csdn.net/qq_16399457/article/details/103951398