数据库按照手机号分库后,还需要允许用户使用邮箱、用户名等登录,咋才能提高查询效率

用户可以使用手机号,邮箱,编号登录,数据量特别大,需要分表,现在按照手机号hash进行分表,但是这样的话,使用邮箱或者编号登录的话怎么办呢?回答:1.数据量特别大,就算用户量再,相信贵公司的产品不会超过 3亿账号,若是如此的话,建议拆分的时候采用路由表的模式,而不是HASH,也即你们的拆分手段就做不对。2.若是按照手机号码拆分的话,则会导致其他的 邮箱地址 和 编号登录的时候,需要扫描整个拆分库,则效率会非常糟糕,建议迅速调整拆分的架构,折中的办法,增加一个数据库,也即 手机号码 同 邮箱 和 编号 的对照关系,若是按手机号码,则直接进行HASH; 若是 邮箱 或编号登录的话,则查找对照表中的手机号码是多少,再HASH算法访问。
■网友
看分的库的数量,如果10个左右:可以第一次循环:for DB in DBs 查询DB中的{邮箱,编号} if 匹配 缓存{邮箱,编号} 和 DB 的对应关系 让用户登录 endend下次就可以直接从缓存中读取{邮箱,编号}和具体库的对应关系了。缓存可以用memcached或者redis。如果分的库太多,需要新建映射表表1:邮箱 手机号表2:编号 手机号由于表1和表2字段很少,所以本身可以存储比较大的数据量,也可以再切分。
■网友
在手机、邮箱、编号同时可以登录的情况下。暂且把这三者统称为帐号,数据量庞大可以它们独立出来,做成帐号表,按类型可以再设计分表策略。比如手机分成数个表,邮箱、编号这也如此。每张表都有个字段记录这个帐号所对应的用户(最好直接能找到所在表)。这些表就构成了帐号表,现在好了,如果用户使用邮箱登录,就按照上面邮箱分表的规则找到所在表,再查找具体用户。PS:为啥拿用户按手机分表?所有用户都有?而且不会修改?
■网友
主表,用户ID,密码,手机表名称的特征码,email表名称的特征码等,根据用户ID hash附表 :手机,email,密码,分别和用户ID建表,接收到post的时候,先判断是什么类型,然后去查找。要根据ID找出表的特征码(hash),然后查找。以般情况下,为了安全,登陆信息跟用户的信息不能放在一个表里。


    推荐阅读