iborodikhin/pshard

适用于PDO的简单分片库。

dev-master 2016-03-07 15:35 UTC

This package is not auto-updated.

Last update: 2024-09-24 05:05:38 UTC


README

Build Status

使用PDO在多个虚拟分片和多个真实分片之间分片数据。

用法

  1. 创建包含数据的表

    CREATE TABLE real_shard (
        'id' INT(10) NOT NULL AUTO_INCREMENT,
        'name' VARCHAR(50) NOT NULL,
        'dsn' VARCHAR(50) NOT NULL,
        'username' VARCHAR(50) NOT NULL DEFAULT '',
        'password' VARCHAR(200) NOT NULL DEFAULT '',
        'options' VARCHAR(1000) NOT NULL DEFAULT '',
        PRIMARY KEY ('id'),
        UNIQUE KEY 'name' ('name')
    ) ENGINE=InnoDB;
    INSERT INTO real_shard VALUES (NULL, 'real_shard1', 'mysql:host=1.2.3.4;dbname=shard', 'user', 'pAsSwOrD', '{json_encoded_options_list}');
    
    CREATE TABLE virtual_shard (
        'id' INT(10) NOT NULL AUTO_INCREMENT,
        'virtual' VARCHAR(50) NOT NULL,
        'real' VARCHAR(50) NOT NULL,
        PRIMARY KEY ('id),
        UNIQUE KEY 'virtual_real' ('virtual', 'real')
    ) ENGINE=InnoDB;
    INSERT INTO virtual_shard VALUES (NULL, 'virtual_shard1', 'real_shard1');
    INSERT INTO virtual_shard VALUES (NULL, 'virtual_shard2', 'real_shard1');
    ...
    INSERT INTO virtual_shard VALUES (NULL, 'virtual_shardN', 'real_shard1');
    
  2. 为包含分片映射的数据库创建PDO实例

    <?php
    $shardMap = new \PDO(
        $dsn,
        $username,
        $password,
        $options
    );
  3. 创建PShard实例并用于查询

    <?php
    $pShard = new \PShard\PShard($shardMap);
    $statement = $pShard->getConnectionForKey($user['mail'])
        ->prepare('INSERT INTO users (name, mail) VALUES (:name, :mail)');
    $statement->bindValue('name', $user['name'], \PDO::PARAM_STR);
    $statement->bindValue('mail', $user['mail'], \PDO::PARAM_STR);
    $statement->execute();