大量のデータへの同時アクセスに直面すると、従来の単一データベース アーキテクチャではパフォーマンス上の問題が発生することが多く、データベース サブデータベースとサブテーブルはデータベースのパフォーマンスを最適化するために必要な手段の 1 つとなっています。この記事では、PHPプログラミングにおけるデータベースシャーディングとテーブルシャーディングの実践的な方法と注意点を詳しく紹介します。
1. データベース シャーディングとは何ですか?
データベース シャーディングはシャーディングと呼ばれ、大規模なデータベースを複数の小さなデータベースに分割すること、または大きなテーブルを複数の小さなテーブルに分割して分散することを指します。データベースの処理能力とパフォーマンスを向上させるために、ストレージと処理のために異なる物理マシンに接続します。データベースとシャーディング テーブルの主な利点は次のとおりです:
1. データベースの同時アクセス能力が向上し、単一障害点の問題が軽減されます。
2. データ ストレージを分散して、システム全体の処理能力を向上させます。
3. データのバックアップとリカバリの時間を短縮し、運用と保守の効率を向上させます。
4. ビジネスの水平展開をサポートし、水平展開コストを削減します。
2. PHP プログラミングにおけるサブライブラリとサブテーブルの実践
1. サブライブラリ
PHP プログラミングでは、1 つのマスターと複数のスレーブを使用して、ブランチライブラリを実現します。 1 マスター、複数スレーブのアーキテクチャでは、書き込み操作はマスター ライブラリでのみ実行できますが、読み取り操作は複数のスレーブ ライブラリで実行できます。具体的な実装方法は次のとおりです。
1) まず、PDO を通じてメイン ライブラリに接続するための DB クラスを定義する必要があります:
class DB{
private static $instance; private $pdo; private function __construct() { $config = ['host' => '127.0.0.1', 'port' => '3306', 'dbname' => 'main', 'username' => 'root', 'password' => '123456', 'driver' => 'mysql' ]; $dsn = $config['driver'].":host=".$config['host'].";port=".$config['port'].";dbname=".$config['dbname']; $this->pdo = new PDO($dsn, $config['username'], $config['password']); } public static function getInstance(){ if(self::$instance === null){ self::$instance = new self(); } return self::$instance; } public function getPdo(){ return $this->pdo; }
}
2) 次に、DB クラスで select メソッドを定義し、クエリ用のスレーブ データベースをランダムに選択します。
public function select($sql, $params){
try{ $slave = ['slave1', 'slave2', 'slave3']; $dbIndex = array_rand($slave); $config = ['host' => '127.0.0.1', 'port' => '3306', 'dbname' => $slave[$dbIndex], 'username' => 'root', 'password' => '123456', 'driver' => 'mysql' ]; $dsn = $config['driver'].":host=".$config['host'].";port=".$config['port'].";dbname=".$config['dbname']; $pdo = new PDO($dsn, $config['username'], $config['password']); $stmt = $pdo->prepare($sql); $stmt->execute($params); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); return $result; }catch(PDOException $e){ die($e->getMessage()); }
}
上記の方法により、読み取り操作中にクエリ用のスレーブ データベースをランダムに選択し、データベースの分割を実現できます。
2. テーブルの分割
PHP プログラミングでは、ID のパリティを使用してデータを異なるテーブルに分散できます。 ID が偶数の場合は偶数テーブルに格納され、ID が奇数の場合は奇数テーブルに格納されます。具体的な実装方法は次のとおりです。
1) まず、データベースとテーブル パーティショニング ロジックを接続するための DbUtil クラスを定義します。
class DbUtil{
private static $instance; private $pdo; private function __construct(){ $config = ['host' => '127.0.0.1', 'port' => '3306', 'dbname' => 'test', 'username' => 'root', 'password' => '123456', 'driver' => 'mysql' ]; $dsn = $config['driver'].":host=".$config['host'].";port=".$config['port'].";dbname=".$config['dbname']; $this->pdo = new PDO($dsn, $config['username'], $config['password']); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public static function getInstance(){ if(self::$instance === null){ self::$instance = new self(); } return self::$instance; } public function getPdo(){ return $this->pdo; } public function selectById($id){ $tableName = self::getTableName($id); $sql = "SELECT * FROM ".$tableName." WHERE id=:id"; $params = [':id' => $id]; $stmt = $this->pdo->prepare($sql); $stmt->execute($params); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); return $result; } private static function getTableName($id){ $isEven = $id % 2 == 0; if($isEven){ return 'even_table'; }else{ return 'odd_table'; } }
}
2) 次に、クライアント コードに実装します:
$id = 123;
$dbUtil = DbUtil::getInstance();
$result = $dbUtil->selectById ($id );
上記の方法により、ID のパリティに従ってデータを異なるテーブルに分散できます。
3. データベースシャーディングとテーブルシャーディングの注意事項
4. 概要
PHP プログラミングでは、データベースの処理能力とパフォーマンスを向上させるために、サブデータベースとサブテーブルという方法を使用できます。サブデータベースとサブテーブルは、単一点障害のリスクを軽減しながら、システムの同時処理能力を向上させることができます。ただし、サブデータベースとサブテーブルを使用する前に、データの一貫性の問題を考慮し、SQL ステートメントを最適化してデータベース クエリの効率を向上させる必要があります。
以上がデータベースサブテーブル最適化の実践: PHP プログラミングでの応用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。