`
hanyh
  • 浏览: 227990 次
  • 性别: 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解决方案

    本文讲的是mysql大数据分库和分表 php解决方案。 mysql分库分表方案、mysql 分库方案、php实现mysql分库分表、mysql高并发解决方案。

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

    水平拆分数据分库和分表的核心问题是表的ID唯一,然后根据唯一的ID映射到一个物理存储位置,这个映射方案要考虑到满足数据量暴增线性扩展和业务上容易保持一致,本文主要讨论分库分表如何映射的问题。

    分库分表面试题- pdf

    [分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf[分库分表]面试题 pdf...

    MySQL分库分表课件.zip

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

    sharding + mybatis-plus 分库分表

    sharding-jdbc 分库分表 CRUD

    php mysql分库分表实例

    php分库分表

    分库分表-zdal

    分库分表组件,支持自动主备切换,动态切分,读写分离,支付宝分库分表架构

    springmvc分库分表实际例子

    springmvc分库分表实际例子 maven项目 欢迎下载试用

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

    本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧

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

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

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

    功能: 通过配置文件以及sql模板文件自动生成 分库分表,单库分表的sql脚本 最新更新: 1、支持分库不分表的脚本生成 2、修正重复索引报错问题

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

    spring动态数据源整合mybatis实现的分库分表操作。 分库分表对业务代码是透明的,只需要在配置文件分配分库模版即可动态的实现分库分表的增删改查操作。

    分库分表Sharding中间件Kamike.divide.zip

    开源个人参考淘宝的TDDL分库分表思路写的一个分库分表中间件Kamike.divide. 分库分表这个是8月份左右跟淘宝的数据分析部门的架构师离哲交流的时候产生的想法,离哲推荐采用TDDL进行分库分表。 回去一看,却...

    数据库分库分表中间件实践

    数据库分库分表中间件实践,降低单机负载 降低单点故障带来的影响 提高读写的性能

    数据库分库分表

    数据库分库分表 数据库分库分表 数据库分库分表

    MySQL分库分表技术

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

    一个MySQL分库分表php类

    一个MySQL分库分表php类。当一个表数据记录过大时...一般而言,分库分表属于水平分割,按照一定的规则将数据插入到不同的表中去。而分库则可以很方便的转移数据库的压力,比如将一个很大库的分 别放在不同的服务器上。

    mycat 分库分表

    基于mycat1.6.5改进 同时支持分库分表

    分库分表_基于当当jdbc-sharding

    分库分表_基于当当jdbc-sharding,分库分表_基于当当jdbc-sharding

    Python+MySQL分表分库实战

    Python+MySQL分表分库实战. 值得收藏与下载哦....!!!!!!!!!!!!

Global site tag (gtag.js) - Google Analytics