`

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取前三位或者四位甚至更多位了。

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

分享到:
评论

相关推荐

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

    【数据库水平切分实现原理解析】 随着互联网的发展,海量数据的存储与访问已成为系统设计的关键挑战。面对每天数十亿的页面访问量(PV),数据库的高负载问题日益突出,严重影响了系统的稳定性和扩展性。水平切分...

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

    ### MySQL 数据库水平切分的实现原理解析 #### 第1章 引言 随着互联网技术的迅猛发展,海量数据的存储与访问已成为系统设计的关键挑战之一。在高流量应用场景中,例如大型电商平台或社交网络平台,每日数十亿次页面...

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

    **水平切分**则是根据数据本身来划分,通常基于某个特定字段,如用户ID`userid`,按照一定的规则(如取模)将数据分散到多个表或数据库实例上。这使得每个实例的负载更小,性能得到提升。例如,可以使用范围法,如...

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

    ### 单KEY业务,数据库水平切分架构实践 #### 用户前台侧:“建立非uid属性到uid的映射关系”最佳实践 在面对大量的用户数据时,为了提高数据库系统的响应速度和处理能力,需要采取合适的数据库水平切分策略。水平...

    MYSQL学习资料

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

    oracle 数据库设计.docx

    - MySQL水平切分(分片) - Oracle分区 - Oracle物化视图 - 中间表方案 3. **索引与物化视图的设计** 4. **数据切分策略** #### 二、业务需求分析与切分 在进行数据库设计之前,首先要对业务需求有一个清晰的...

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

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

    数据切分方法

    MySQL Proxy支持多种切分策略,包括垂直切分和水平切分,并且可以实现读写分离等功能。虽然MySQL Proxy提供了丰富的功能,但它并不直接支持SQL语法,需要开发者自己编写Lua脚本来实现特定的逻辑,这在一定程度上增加...

    数据库分库技巧

    其中,水平切分通过将数据按照某种规则分散到多个数据库实例中,能够有效减轻单个数据库的压力,并提高整体系统的可用性和容错性。本文将重点介绍水平切分中的关键技术——分库、分表、主从复制、集群及负载均衡等,...

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

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

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

    水平切分是指将数据库分割成多个小的数据库,以便提高系统的可扩展性。 2. MySQL 集群拓扑结构 MySQL 集群可以有多种拓扑结构,例如: (1)一主多从结构:一个主服务器和多个从服务器。 (2)多主多从结构:多...

    mysql-5.7.34-winx64.zip

    在MySQL中实现分库分表有多种方法,包括垂直分割和水平分割。 1. **垂直分割**:这种方法基于数据属性进行切分,将表中的列分为两个或更多个表。通常,我们将不常访问或者大容量的列移到另一个表中,这样可以减少主...

    Linux下的MySQL调优

    - **垂直/水平切分**:通过垂直或水平切分服务器或数据表来分散负载。 - **MySQL复制**:利用MySQL复制技术实现读写分离,提高读取性能。 - **负载均衡**:在复制的基础上,可以通过多个从服务器实现负载均衡。 - **...

    新浪:基于MySQL的分布式数据库实践1

    在新浪的分布式数据库实践中,使用了Sharding策略来实现数据库的水平切分。Sharding是指将数据库按照一定的规则分割成多个小的数据库,每个小数据库都可以独立工作。这种策略可以提高数据库的性能和可扩展性。 在...

    MySQL中如何进行分库分表的设计和实现?

    数据切分策略:根据具体业务需求选择合适的切分策略,常见的切分策略有水平切分、垂直切分和跨库查询。水平切分按照某个条件将数据行拆分到不同的数据库表中,例如按照用户 ID 的哈希值进行切分。垂直切分按照表的列...

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

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

    mysql集群工具macat

    它在MySQL主从复制的基础上,实现了数据的切分,使单个数据库实例能够处理更大的负载,同时通过负载均衡策略确保了服务的稳定性。 Mycat的核心功能包括: 1. 数据分片:Mycat支持水平分片和垂直分片。水平分片是将...

    Mysql大数据量存储及访问的设计讨论.pdf

    针对大型互联网应用中出现的数据库高负载问题,提出了数据切分策略,包括水平切分、读写分离、负载均衡和集群方案等,以提升系统的稳定性和扩展性。 【标签】:互联网 【内容摘要】: 1. 数据切分策略 数据切分...

    Amoeba的使用及单机多MySQL数据库的配置(特别说明).pdf

    4. **数据切分配置**:在`rule.xml`中启用规则配置,指定垂直切分和水平切分的规则。 **注意事项** 除了Amoeba的配置,系统还需要对MySQL数据库进行主从同步的配置,以保持数据的一致性。主从同步通常涉及binlog...

    Mysql海量数据存储和解决方案之-分布式DB方案.docx

    为了解决这一问题,分布式数据库(分布式DB)方案应运而生,通过水平切分、垂直切分、主从复制(M-S)、集群和负载均衡等技术手段,有效地降低了单台数据库服务器的压力,提升了系统的整体性能和可用性。 1. **数据...

Global site tag (gtag.js) - Google Analytics