`

数据库水平切分方法

 
阅读更多
方法一:使用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

    数据库水平切分架构方案.docx

    分库,数据库水平切分实现原理解析

    平切分,分库,分表,主从,集群 数据库水平切分的实现原理解析

    数据库分库技巧

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 关键字: 水平切分,分库,分表,主从,集群 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一...

    单KEY业务,数据库水平切分架构实践

    • 索引表法:数据库中记录login_name-&gt;uid的映射关系 • 缓存映射法:缓存中记录login_name-&gt;uid的映射关系 • login_name生成uid • login_name基因融入uid 运营后台侧,“前台与后台分离”最佳实践: • 前台、...

    实现数据库水平切分的两个思路

    水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失; 负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性; 集群方案:解决了数据库宕机带来的单点数据库不能访问的问题; ...

    MYSQL 数据库水平切分的实现原理解析

    对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。

    基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分

    在水平切分中,您可能使用了诸如 range、hash 或 list 等分片策略,根据某个字段的值将数据存储到不同的数据库节点上。这样可以提高单个节点的查询性能,同时也支持数据的水平扩展。在实现时,您应该在 MyBatis 的 ...

    数据库表的垂直切分与水平切分

    随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。通过数据切分来提高网站性能,这里整理一份数据库表的垂直切分与水平切分文档供大家研究!

    gaohuerics#geektime#除了水平切分,数据库架构设计还经常遇到哪些问题1

    从《前言:数据库水平切分通用实践》这篇文章,能够了解到:数据库分组架构的概念,特点,解决的问题域,最佳实践。数据库分片架构的概念,特点,解决的问题域,最佳实践。

    基于Mycat的数据库切分方案探索

    传统关系型数据库由于缺乏扩展性,在面对大数据时存在巨大的缺陷,但是关系模型、事务机制对于大部分系统又不必不可少,目前业界主流的做法就是将传统数据库进行切分(包括垂直切分、水平切分等),提高数据库的可...

    MYSQL学习资料

    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数据过于复杂,成为通用痛点的时候,就应该抽象出数据库中间件,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性。

Global site tag (gtag.js) - Google Analytics