水平分表之基因法
假设有下面的订单表,字段为order_id, uid, award,假设订单的量很大,要进行拆表
1. 需求:查询某个订单order_id的详情
开始的时候拆分方式,按照order_id % 2的方式,进行拆分,如下图
查询某个订单的详情:直接通过order_id%2,找到对应的表,就可以查到
2. 后面又新增了一个需求:查询某个用户uid所有的订单
分析:按照上面的order_id%2的方式分表 ==> 由于相同的用户uid=101被分到了2张表,查询造成很大的困难。
有人说,可以使用uid进行拆表,那么想查询某个uid下面的所有订单,就可以直接去某一张表查询了。
==> 分析:该方法当然可以,但是对于需求1“查询某个订单order_id的详情”,又造成了困难,因为不知道该order_id坐落在哪张表(所以,查询某个order_id的详情,就需要遍历所有的表)
------------------有没有两种查询场景都符合的分表方式呢?------------------------
基因法
1. 把uid的尾部,截取片段作为基因
2. 在生成订单号order_id的时候,传入基因,拼接成最后的订单号,即order_id = 雪花算法id + 基因 (说明,订单号order_id的生成规则要修改,即,传入uid)
3. 采用生成的订单号order_id,进行水平分表(拆分表的规则是,基因必须坐落在相同的表中)
效果:相同uid的订单号,因为有相同的后缀,一定会落到相同的表中
1. 查询每个订单详情:直接可以查询到
2. 查询每个用户所有订单:因为在同一个表中,也方便查询