方法一:使用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等
分享到:
相关推荐
### 二、用户中心水平切分方法 水平切分的基本思想是将数据根据一定的规则分配到不同的数据库实例中。常见的水平切分算法有两种: 1. **范围法**:这是一种较为直观的切分方法,根据主键(例如`uid`)的值将其映射...
数据库水平切分是一种应对大规模数据存储和高并发访问的有效架构策略。在传统的单库单表设计中,随着数据量的增长,数据库性能会显著下降。针对这种情况,"订单中心"业务作为一个典型的"多 key"类业务,需要进行...
### MySQL 数据库水平切分的实现原理解析 #### 第1章 引言 随着互联网技术的迅猛发展,海量数据的存储与访问已成为系统设计的关键挑战之一。在高流量应用场景中,例如大型电商平台或社交网络平台,每日数十亿次页面...
### 数据库表的垂直切分与水平切分详解 #### 一、引言 随着互联网技术的迅猛发展,海量数据的处理成为系统架构设计中的一大挑战。为了应对日益增长的数据量,提高系统的可扩展性和性能,数据库表的切分技术变得尤为...
水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失; 负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性; 集群方案:解决了数据库宕机带来的单点数据库不能访问的问题; ...
其中,水平切分通过将数据按照某种规则分散到多个数据库实例中,能够有效减轻单个数据库的压力,并提高整体系统的可用性和容错性。本文将重点介绍水平切分中的关键技术——分库、分表、主从复制、集群及负载均衡等,...
在水平切分中,您可能使用了诸如 range、hash 或 list 等分片策略,根据某个字段的值将数据存储到不同的数据库节点上。这样可以提高单个节点的查询性能,同时也支持数据的水平扩展。在实现时,您应该在 MyBatis 的 ...
1. 水平切分(Sharding):在这种方法中,数据根据某个字段的值进行分割,比如用户ID。所有具有相同分割键的记录被分配到同一个分片。这样,每个分片存储的数据量相对较少,查询效率得以提升。 2. 垂直切分...
在实际应用中,往往会采用垂直切分和水平切分相结合的方法来构建数据库架构。具体来说,可以先根据业务模块进行垂直切分,然后针对每个模块内的表再进行水平切分。 1. **垂直切分策略**: - 分析表之间的聚合关系...
从《前言:数据库水平切分通用实践》这篇文章,能够了解到:数据库分组架构的概念,特点,解决的问题域,最佳实践。数据库分片架构的概念,特点,解决的问题域,最佳实践。
传统关系型数据库由于缺乏扩展性,在面对大数据时存在巨大的缺陷,但是关系模型、事务机制对于大部分系统又不必不可少,目前业界主流的做法就是将传统数据库进行切分(包括垂直切分、水平切分等),提高数据库的可...