`
hanyh
  • 浏览: 235634 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分库和分表

    博客分类:
  • php
阅读更多
1,背景:一个地址薄的应用程序,设计的用户量为2亿,统计出每个用户的地址薄为30个左右,整个数据量为60亿,使用mysql数据库
计划分为:1000个表,100个库

2,分库分表代码
    private function getDbNo($email)
    {
        $m = md5($email);
        $n = hexdec(substr($m, 0, 16));
        $tableNo = fmod($n, 1000);
        $dbNo = $tableNo % 100;
        return array($dbNo, $tableNo);
    }

3,配合的连接访问代码
require_once 'Db/Config.php';

class Db_Adapter
{
    const MASTER    = 0;
    const SLAVE     = 1;

    private static $instances = array();

    private $conf = array();

    private $conns = array();

    private $conn = NULL;
    private $stmt = NULL;
    
    public function __construct($conf)
    {
        $this->conf = $conf;
    }

    public function execute($sql, $params)
    {
        $cmd = substr(strtolower(trim($sql)), 0, 6);
        if ($cmd == 'select') {
            $conn = $this->getConn(self::SLAVE);
        } else {
            $conn = $this->getConn(self::MASTER);
        }

        $conn->prepare($sql);
        $stmt = $conn->execute($params);

        $this->conn = $conn;
        $this->stmt = $stmt;
    }

    public function fetch()
    {
        return $this->stmt->fetch();
    }

    public function fetchAll()
    {
        return $this->stmt->fetchAll();
    }

    public function lastInsertId($name = NULL)
    {
        return $this->conn->lastInsertId($name);
    }

    public function rowCount()
    {
        return $this->stmt->rowCount();
    }

    private function getConn($type)
    {
        if ($type == self::SLAVE && isset($this->conf[self::SLAVE])) {
            $id = 0;
        } else {
            $id = 1;
        }

        if (!isset($this->conns[$id])) {
            $conf = $this->conf[$id];
            $this->conns[$id] = new PDO(
                $conf['dsn'], $conf['user'], $conf['pass'],
                self::dbOptions);
        }

        return $this->conns[$id];
    }

    public static function getInstance($dbName, $dbNo = 0)
    {
        $key = $dbName . '_' . $dbNo;
        if (!isset(self::$instances[$key])) {
            $conf = Db_Config::getConfig($dbName, $dbNo); //连接配置参数
            self::$instances[$key] = new self($conf);
        }

        return self::$instances[$key];
    }
}


4,潜在问题
如果某个表中的那些用户的地址薄联系人超多,如每个人1000个,则可能出现该表超大,需要把该表区分为子表,暂时没有配置中心来处理该情况。
(若真的出现该情况,在连接参数这个地方继续作一次hash)。
4
0
分享到:
评论
1 楼 hnraysir 2014-10-23  
必须登录评论下,谢谢。
by elesos.com

相关推荐

    mysql大数据分库和分表 php解决方案

    分库分表是针对大型应用中的海量数据进行管理和优化的一种常见策略。其核心目的是通过将大量数据分布在不同的数据库或不同的表中,来降低单一数据库的压力,提高数据处理效率。具体而言,分库分表可以分为两种主要...

    数据分库分表之二叉树分库分表

    分库分表主要有两种形式:水平分库分表和垂直分库分表。本文着重讨论的是水平分库分表,即不改变表结构的情况下,将表中的数据分散到不同的数据库或表中。 ##### 2.2 水平分库分表的关键问题 水平分库分表的核心...

    Python+MySQL分表分库实战

    Python作为一种流行的编程语言,与MySQL数据库结合使用,可以方便地实现分库分表的各种操作和自动化处理。 本实战教程将通过一系列知识点的介绍,讲解如何使用Python配合MySQL来实现分库分表的实战操作。首先,我们...

    分库分表自动建库表小工具

    总的来说,这个小工具是数据库管理员和开发者的得力助手,它简化了分库分表的实现过程,提高了工作效率,并且随着版本的更新,其功能也在不断优化和完善,能够更好地适应各种数据库管理和优化的需求。在使用过程中,...

    springmvc分库分表实际例子

    通过学习和实践这个“springmvc分库分表实际例子”,开发者可以更好地掌握如何在SpringMVC项目中运用分库分表技术,提升系统的扩展性和性能。同时,理解ShardingSphere的工作原理和配置方法,将有助于在实际工作中...

    Mysql数据库分库和分表方式(常用)

    MySQL数据库在面临大数据量时,为了提升性能和可扩展性,通常会采用分库和分表的策略。本文将详细探讨这两种方法。 1. **分库** 分库是指将一个大型数据库分解为多个较小的数据库,每个数据库专注于特定的功能或...

    MySQL分库分表技术

    总结,MySQL的分库分表技术是应对大数据量和高并发场景的重要手段,它通过合理的设计和策略,能够有效地提升系统的扩展性和性能,但同时也带来了数据一致性和运维复杂性的挑战。实践中需要根据业务特性选择合适的分...

    Spring MVC +Spring + Mybatis 构建分库分表源码

    在本资源中,我们主要探讨如何使用Spring MVC、Spring和Mybatis这三大流行框架来构建一个支持分库分表的应用。这些技术都是Java Web开发中的关键组件,它们各自承担着不同的职责并协同工作,以实现高效、可扩展的...

    MySQL 分库分表的实现原理及演示案例

    MySQL分库分表是一种数据库架构优化技术,其目的是为了提高大型数据库系统的性能和可扩展性。在面对大规模数据和高并发访问时,单库单表往往难以满足需求,分库分表就成为了必要之选。分库分表技术可以将数据分散...

    MySQL分库分表课件.zip

    MySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库...

    php mysql分库分表实例

    分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决单一数据库性能瓶颈问题。垂直切分是根据业务逻辑将数据分散到多个数据库中,通常依据表的相关性或访问频率来进行。而水平切分则是按照某个字段(如用户...

    spring动态数据源+mybatis分库分表

    "spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    在现代企业级应用开发中,数据量的增长往往超出单个数据库的处理能力,这时就需要采用分库分表的技术来提高系统的扩展性和性能。本项目基于Java、SpringBoot、MyBatis以及ShardingJDBC实现了一个分库分表的解决方案...

    分库分表总结

    开发者在选择和实施分库分表方案时,需要充分评估业务需求、系统架构和现有技术栈,确保方案的可行性和扩展性。此外,持续关注和学习相关工具的发展,可以帮助我们更好地应对大数据时代的挑战。

    sharding + mybatis-plus 分库分表

    "Sharding + Mybatis-Plus 分库分表"的主题就是针对这个问题提出的解决方案。Sharding-JDBC是一个轻量级的Java框架,它可以在不改变任何数据库语义和业务代码的情况下,实现数据库的水平拆分,从而提高系统的并行...

    基于分布式的数据库分库与分表策略研究.pdf

    数据库代理服务器在收到插入操作的SQL语句后,会根据任务分配表原则进行分库分表操作,同时生成路由表,便于后续数据的更新、删除等操作的快速定位。 在实际操作中,数据库插入操作时,客户端首先发送插入语句给...

    48_你们当时是如何把系统不停机迁移到分库分表的?.zip

    标题中的“48_你们当时是如何把系统不停机迁移到分库分表的?”提示了本次讨论的主题,即如何在不...以上就是对系统不停机迁移到分库分表这一主题的详细解析,具体的技术细节和实践操作可以参考提供的文档和图片资料。

    sharding分库分表demo

    本示例通过整合一系列技术,包括SpringBoot、ShardingSphere、Swagger和MyBatis-Plus,来演示如何在实际应用中实现分库分表的操作。 首先,SpringBoot是一个基于Spring框架的轻量级启动器,它简化了初始化和配置...

Global site tag (gtag.js) - Google Analytics