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

戏子无情 提交于 2020-01-13 23:17:56

注意点:无论按哪个纬度分表,订单号需要全局唯一,且需要包含库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分表。

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!