跳转到内容

避免分表数据倾斜

单表数据量过大时,往往需要分表来解决数据库性能问题。

分表通常使用日期或者用户 id 来进行划分。如:电商订单表根据用户 id 来分 100 张表。开发者可以按照用户 id 取模 % 100。如用户 id 为 23423432234。

23423432234 % 100 = 34

此时就可以将对应数据放入 order_34 这张表中。

如果当前开发者根据卖家 id 进行分表,可能会导致数据倾斜。因为有些商家订单数据很多,有些商家订单数据较少。如此,多张表的数据量差距就很大,甚至导致性能问题。

想要解决这个问题,就得在当前数据项中寻找到更加平衡的维度。如果我们不使用卖家 id,而是根据买家 id 进行分表,往往就不会出现数据倾斜。因为一个买家一般来说不会有非常多的订单数据。

针对电商系统来说,买家远远多于卖家,针对买家查询同一张表则会更快。同时开发者再根据 binlog 等信息生成卖家 id 对应的数据信息供卖家进行查询。

事实上,除了卖家和买家,往往第三方也需要对订单进行查询。如果当前没有买家 id 或者卖家 id 是否就不能查询了呢?答案是否定的。

电商系统往往会在订单号上添加对应信息。如同一个买家的淘宝订单号后六位都是相同的,而同一个买家的拼多多订单号后四位都是相同的(前六位是年月日)。不过在抖音平台个人没有发现订单位数相同的规律(相同买家或卖家均没有相同位数)。