方法一:使用MD5哈希
做法是对UID进行md5加密,然后取前几位(我们这里取前两位),然后就可以将不同的UID哈希到不同的用户表(user_xx)中了。
通过这个技巧,我们可以将不同的UID分散到256中用户表中,分别是user_00,user_01 ...... user_ff。因为UID是数字且递增,根据md5的算法,可以将用户数据几乎很均匀的分别到不同的user表中。
但是这里有个问题是,如果我们的系统的用户越来越多,势必单张表的数据量越来越大,而且根据这种算法无法扩展表,这又会回到文章开头出现的问题了。
方法二:使用移位
我们将uid向右移动20位,这样我们就可以把大约前100万的用户数据放在第一个表user_0000,第二个100万的用户数据放在第二个表user_0001中,这样一直下去,如果我们的用户越来越多,直接添加用户表就行了。由于我们保留的表后缀是四位,这里我们可以添加1万张用户表,即user_0000,user_0001 ...... user_9999。一万张表,每张表100万数据,我们可以存100亿条用户记录。当然,如果你的用户数据比这还多,也不要紧,你只要改变保留表后缀来增加可以扩展的表就行了,如如果有1000亿条数据,每个表存100万,那么你需要10万张表,我们只要保留表后缀为6位即可。
/**
* 根据UID分表算法
*
* @param int $uid //用户ID
* @param int $bit //表后缀保留几位
* @param int $seed //向右移动位数
*/
function getTable( $uid , $bit , $seed ){
return "user_" . sprintf( "%0{$bit}d" , ($uid >> $seed) );
}
如果我们预估我们系统的用户是100亿,单张表的最优数据量是100万,那么我们就需要将UID移动20来确保每个表是100万的数据,保留用户表(user_xxxx)四位来扩展1万张表。
又如第一种方案,每张表100万,md5后取前两位,就只能有256张表了,系统总数据库就是:256*100万;如果你系统的总数据量的比这还多,那你实现肯定要MD5取前三位或者四位甚至更多位了。
第三种:
基于范围的切分, 比如 memberId > 10000 and memberId < 20000
第四种:
基于模数的切分, 比如 memberId%128==1 或者 memberId%128==2 或者...
第五种:
基于哈希(hashing)的切分, 比如hashing(memberId)==someValue等
分享到:
相关推荐
数据库水平切分的实现原理解析
数据库水平切分架构方案.docx
平切分,分库,分表,主从,集群 数据库水平切分的实现原理解析
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 关键字: 水平切分,分库,分表,主从,集群 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一...
• 索引表法:数据库中记录login_name->uid的映射关系 • 缓存映射法:缓存中记录login_name->uid的映射关系 • login_name生成uid • login_name基因融入uid 运营后台侧,“前台与后台分离”最佳实践: • 前台、...
水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失; 负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性; 集群方案:解决了数据库宕机带来的单点数据库不能访问的问题; ...
对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。
在水平切分中,您可能使用了诸如 range、hash 或 list 等分片策略,根据某个字段的值将数据存储到不同的数据库节点上。这样可以提高单个节点的查询性能,同时也支持数据的水平扩展。在实现时,您应该在 MyBatis 的 ...
随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。通过数据切分来提高网站性能,这里整理一份数据库表的垂直切分与水平切分文档供大家研究!
从《前言:数据库水平切分通用实践》这篇文章,能够了解到:数据库分组架构的概念,特点,解决的问题域,最佳实践。数据库分片架构的概念,特点,解决的问题域,最佳实践。
传统关系型数据库由于缺乏扩展性,在面对大数据时存在巨大的缺陷,但是关系模型、事务机制对于大部分系统又不必不可少,目前业界主流的做法就是将传统数据库进行切分(包括垂直切分、水平切分等),提高数据库的可...
DB 数据库水平切分的实现原理解析 MySQL 5 5 rpm格式 在Linux上安装 mysql memcached UDF安装使用 MySQL Proxy应用入门 1 安装MySQL Proxy MySQL Proxy应用入门 2 MySQL Proxy配置选项 MySQL Proxy应用入门 3 使用...
当数据库水平切分,base-service层获取db数据过于复杂,成为通用痛点的时候,就应该抽象出数据库中间件,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性。