用户中心是每一个公司必备的基础服务,用户的注册,登录,信息查询都离不开用户中心。当数据量越来越大的时候,需要多用户进行水平切分。最常见的水平切分方式,按照uid取膜分库,通过取膜将数据分布到多个数据库实例,提高服务实例个数,已达到扩容的目的。
如果按照uid查询可以直接路由到库。如图水平切分之后:
假如 uid=121,取膜之后直接定位到db1
如果是uname查询,假设uname=hello,就没有办法定位到库了。
如果想要高效的查询,今天主要讨论两种方案。
1.【索引表方法】
思路:uid可以直接定位到库,uname不能直接定位到库,如果能通过uname 定位到 uid那么为问题解决。下面来说下怎么通过uid定位到uname
解决方案:
1)建立一个索引记录表,映射关系uname 对应 uid。并且建立索引
2)当用uname查询时,先通过uname查询到uid,在定位到库
3)索引表数据属性少,可以容纳很多数据,一般不需要分库
4)如果数据量过大可以按uname分库
缺点:多一次数据库的查询,性能下降一半
2【缓存映射方法】
思路:访问索引表性能低,把映射关系放到缓存中
解决方案:
1)通过uname先查到缓存与uname的对应关系uid
- uname和uid关系不会变化,因为uname和uid都是唯一的
缺点:多一次缓存查询
以上是在分库分表中遇到的问题以及解决方案,个人认为第二中方案比较好。
网友评论