随着业务的持续增长,注册用户不断增长,查询压力越来越大,亟需对用户表进行拆分。
采用最常规的拆分方法,对userId进行取模运算,根据取模结果,数据落到不同的库中
这样一来,数据就分散了,大大降低单库的数据量,可以实现数据扩容,根据userId查询时需要先对userId进行取模运算,以决定需要从哪个库查找,查询过程如下
例如有个userId为157,根据流程,157%3 = 1,它应该查询u_db1库
但是如果根据userName查询,那么问题就不这么简单了,因为事先并不知道userName落在哪个库,只能一个一个库去查询,当库比较少的时候,尚可接受,但是库多了,性能必定受影响很大。
怎么办呢?
(1)、关系映射
正常逻辑是userId—>userName,根据userId能查询到userName,逆向思维,建立一张中间表,表中为userName—>userId的映射关系,不包含其他字段,查询时先查询此关系表,在根据结果去查询完整数据
缺点是显而易见的,多查了一次数据库,而且可能存在userName重复的情况
(2)让userId与userName发生点关系
即知道了userName能知道userId,能想到的方法就是设计一个函数用userName去生成userId,uid=f(uname);查询时根据此方法,算出userId,然后去查询完整信息
缺点:这个函数设计难度很大,因为有重复的危险
(3)顺着思路2继续改进,目标就是需要拿到userName知道去哪个库找,而库又是根据userId决定的,那么可以在userId中留下几位特征码,这几位特征码取决于userName,如此一来,就能实现快速查找了,怎么做呢,比如userId一共32位,可以留出最后3位给userName
思路有了,马上去实践一下