PHP マイクロサービスで分散クエリとインデックス作成を実装する方法
インターネット アプリケーションの開発に伴い、データ量が増加しており、単一マシンのデータベースでは対応できません。クエリとインデックス作成の要件を満たさなくなります。分散クエリとインデックス作成がソリューションの 1 つになりました。この記事では、PHP マイクロサービスで分散クエリとインデックス作成を実装する方法を紹介し、具体的なコード例を示します。
分散クエリでは、データの断片化が非常に重要です。データ シャーディングではデータが複数のノードに分散して保存され、各ノードにはデータの一部のみが保存されるため、単一ノードへの負荷圧力が軽減されます。 PHP マイクロサービスでは、ハッシュ シャーディング アルゴリズムを使用して、データをさまざまなデータベース ノードに分散できます。
ユーザーの ID、名前、年齢などのフィールドを含むユーザー テーブルがあるとします。まず、シャードの数を決定する必要があります。シャードの数は、ユーザー ID のハッシュ値に基づいて計算できます。シャードの数が 3 であると仮定すると、次の方法を使用してシャード番号を計算できます。
function shard($id, $shardCount) { return crc32($id) % $shardCount; }
ユーザー ID が 1001 であると仮定すると、次のコードを使用して、ユーザーが割り当てられているシャード番号を取得できます。は:
$shardCount = 3; $userId = 1001; $shardId = shard($userId, $shardCount);
その後、取得したシャード番号に基づいて、クエリのために対応するデータベース ノードに接続できます:
$databaseConfig = [ ['host' => 'node1', 'user' => 'root', 'password' => 'password', 'database' => 'shard1'], ['host' => 'node2', 'user' => 'root', 'password' => 'password', 'database' => 'shard2'], ['host' => 'node3', 'user' => 'root', 'password' => 'password', 'database' => 'shard3'], ]; $connection = new PDO("mysql:host={$databaseConfig[$shardId]['host']};dbname={$databaseConfig[$shardId]['database']}", $databaseConfig[$shardId]['user'], $databaseConfig[$shardId]['password']); // 查询用户信息 $userId = 1001; $query = $connection->prepare("SELECT * FROM user WHERE id = :id"); $query->bindParam(':id', $userId); $query->execute(); $user = $query->fetch(PDO::FETCH_ASSOC);
In分散クエリ、シャードを使用してデータを処理する クエリは単一ノードの負荷圧力を軽減できますが、場合によっては依然としてパフォーマンスのボトルネックが存在します。たとえば、特定のフィールドに対してファジー クエリを実行する場合、照合のためにすべてのノードを走査する必要があり、非効率的です。
この問題を解決するには、分散インデックスを使用できます。分散インデックスでは、インデックス データが複数のノードに分散して保存され、各ノードにはインデックス データの一部のみが保存されます。 PHP マイクロサービスでは、Redis を分散インデックス ストレージとして使用できます。
ユーザー テーブルの名前フィールドに分散インデックスを作成すると仮定すると、次のメソッドを使用できます。
$redisConfig = [ ['host' => 'node1', 'port' => 6379], ['host' => 'node2', 'port' => 6379], ['host' => 'node3', 'port' => 6379], ]; $redis = new Redis(); $redis->connect($redisConfig[$shardId]['host'], $redisConfig[$shardId]['port']); // 建立索引 $userId = 1001; $userName = 'John'; $redis->sAdd("index:user:name:$userName", $userId);
その後、インデックスを使用して分散クエリを完成できます。 :
$userName = 'John'; // 获取索引中保存的用户ID $userIdSet = $redis->sMembers("index:user:name:$userName"); // 查询用户信息 $query = $connection->prepare("SELECT * FROM user WHERE id IN (" . implode(',', $userIdSet) . ")"); $query->execute(); $users = $query->fetchAll(PDO::FETCH_ASSOC);
Pass 上記のコード例では、PHP マイクロサービスで分散クエリとインデックス作成を実装できます。データ シャーディングと分散インデックスを使用すると、クエリとインデックスのパフォーマンスが向上し、増大するデータ ストレージのニーズに合わせてノードを追加することで水平方向に拡張できます。同時に、分散システムの安定性と信頼性を確保するために、データの一貫性や障害回復などの問題にも注意を払う必要があります。
以上がPHP マイクロサービスで分散クエリとインデックス作成を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。