`

mysql水平切分

 
阅读更多

 

在大中型项目中,在数据库设计的时候,考虑到数据库最大承受数据量,通常会把数据库或者数据表水平切分,以降低单个库,单个表的压力。我这里介绍两个我们项目中常用的数据表切分方法。当然这些方法都是在程序中使用一定的技巧来路由到具体的表的。首先我们要确认根据什么来水平切分?在我们的系统(SNS)中,用户的UID贯穿系统,唯一自增长,根据这个字段分表,再好不过。

方法一:使用MD5哈希

做法是对UID进行md5加密,然后取前几位(我们这里取前两位),然后就可以将不同的UID哈希到不同的用户表(user_xx)中了。

 

function getTable( $uid ){
    $ext = substr ( md5($uid) ,0 ,2 );
    return "user_".$ext;
}

 通过这个技巧,我们可以将不同的UID分散到256中用户表中,分别是user_00,user_01 ……    user_ff。因为UID是数字且递增,根据md5的算法,可以将用户数据几乎很均匀的分别到不同的user表中。

但是这里有个问题是,如果我们的系统的用户越来越多,势必单张表的数据量越来越大,而且根据这种算法无法扩展表,这又会回到文章开头出现的问题了。

方法二:使用移位

具体方法是:

 

public function getTable( $uid ) {
    return "user_" . sprintf( "%04d", ($uid >> 20) );
}

 这里,我们将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取前三位或者四位甚至更多位了。

两种方法都是将数据水平切分到不同的表中,相对第一种方法,第二种方法更具扩展性。。。

分享到:
评论

相关推荐

    mysql水平垂直切分PPT教案学习.pptx

    mysql水平垂直切分PPT教案学习.pptx

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

    看过一篇文章,学到一些东西,和大家共享! 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。...通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。

    MYSQL学习资料

    mysql水平扩展">DB 数据库水平切分的实现原理解析 MySQL 5 5 rpm格式 在Linux上安装 mysql memcached UDF安装使用 MySQL Proxy应用入门 1 安装MySQL Proxy MySQL Proxy应用入门 2 MySQL Proxy配置选项 MySQL Proxy...

    amoeba同时做读写分离和水平切分

    这是针对amoeba for mysql的一个具体案例,实现水平切分和读写分离

    数据库分库技巧

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

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

    用户前台侧,“建立非uid属性到uid的映射关系”最佳实践: • 索引表法:数据库中记录login_name->uid的映射关系 • 缓存映射法:缓存中记录login_name->uid的映射关系 • login_name生成uid • login_name基因融入...

    MySQL水平拆分(读书笔记整理)

    一般来说,简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行...

    MySQL大型分布式集群 龙果学院

    水平切分原理及单表切分后的操作-2 00:19:32分钟 | 第46节 水平切分多表关联操作 00:38:14分钟 | 第47节 垂直切分原理及操作 00:17:23分钟 | 第48节 全局序列号 00:21:35分钟 | 第49节 数据库切分策略-分片枚举 ...

    高可用MYSQL,主从复制,集群和负载平衡

    详细介绍Mysql、MariaDB主从复制、多主多从架构、负载平衡和集群的设置。读写分离和数据库垂直、水平切分建议使用Sharding JDBC

    MySQL5.1性能调优与架构设计.mobi

    14.3 数据的水平切分 14.4 垂直与水平联合切分的使用 14.5 数据切分及整合方案 14.6 数据切分与整合中可能存在的问题 14.7 小结 第15章 可扩展性设计之Cache与Search的利用 15.0 引言 15.1 可扩展设计的...

    MySQL分库分表技术

    这个PPT由浅入深,从很少的用户到千万级别的用户,告诉你为什么要使用分库分表,包括垂直和水平切分,偏入门的理论,代码基本无

    MySQL冗余数据的三种方案

    • 使用水平切分来降低单库数据量 • 使用数据冗余的反范式设计来满足不同维度的查询需求 • 使用服务同步双写法能够很容易的实现数据冗余 • 为了降低时延,可以优化为服务异步双写法 • 为了屏蔽“冗余数据”对...

    mysql海量数据存储和访问解决方案

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

    43道MySQL面试题集合(附答案)

    19. 谈谈你对水平切分和垂直切分的理解? 20. 主从复制中涉及到哪三个线程? 21. 主从同步的延迟原因及解决办法? 22. 谈谈你对数据库读写分离的理解? 23. 请你描述下事务的特性? 24. 谈谈你对

    Mycat_V1.6.0权威指南.pdf

    Mycat_V1.6.0权威指南.pdf,MySQL数据库垂直切分、水平切分,逻辑库、逻辑表、分片规则等

    数据切分整合?有章法!

    但是,数据库中的数据经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何让这些数据源得到较好的整合,可能这也是很多读者非常关心的一个问题。本节主要的内容就是分析各种可以...

    总结MySQL的分区

     分区是指根据一定的规则将一个大表分解成多个更小的部分,这里的规则一般就是利用分区规则将表进行水平切分;逻辑上没有发生变化但实际上表已经被拆分成了多个物理对象,每个分成被划分成了一个独立的对象。相对于...

    MYSQL数据库数据拆分之分库分表总结

    数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)...可以通过某种方式将user进行水平的切分,产生两个表结构完全一样的user_0000,user_0001等表,user_0000 + user_0001 + …的数据

    Mycat 1.6 稳定版-linux环境 gz包.7z

    Mycat 1.6 稳定版-linux环境 gz包.7z,mysql管理工具,支持读写分离,水平切分

Global site tag (gtag.js) - Google Analytics