特にデータベース操作を含むプロジェクトでPHPアプリケーションを開発する場合、データベースクエリのパフォーマンスを最適化することが非常に重要です。 MySQLI_RESULTは、MySQLクエリの結果を処理するPHPの関数ですが、場合によっては同じデータベースクエリを複数回実行し、不必要なパフォーマンス損失につながる可能性があります。重複したクエリを回避するために、静的キャッシュ技術を使用してこれらのクエリを最適化できます。この記事では、静的キャッシュを使用してmysqli_result関数を最適化して不必要なデータベースアクセスを削減する方法を紹介します。
静的キャッシュとは、クエリの結果をサーバーのメモリに保存することを指します。同じデータ要求が再び発生すると、データベースクエリを再開始するのではなく、キャッシュからデータを直接取得します。このアプローチは、特にクエリが頻繁に発生し、結果が頻繁に変化しない場合、パフォーマンスを大幅に改善できます。
単純なmysqlクエリがあるとします。
<?php
// データベース接続を作成します
$mysqli = new mysqli("localhost", "user", "password", "database");
// データベースをクエリします
$query = "SELECT * FROM users WHERE id = 1";
$result = $mysqli->query($query);
// プロセスクエリの結果
if ($result) {
$row = $result->fetch_assoc();
echo "User Name: " . $row['name'];
}
?>
この場合、このクエリが実行されるたびに、データベースにアクセスされ、同じクエリが実行されます。このプロセスを最適化するために、結果を最初のクエリの後にキャッシュに保存し、データベースクエリを再度実行する代わりに、後続の要求でキャッシュから直接データを取得できます。
PHPに静的キャッシングを実装する簡単な方法があります。これは、静的変数を使用することです。静的変数は、関数呼び出しの間に値を保持し、クエリの結果を効果的に保存できます。上記のコードを変更して静的キャッシュを使用する方法は次のとおりです。
<?php
// データベース接続を作成します
$mysqli = new mysqli("localhost", "user", "password", "database");
// 静的変数を定義してクエリの結果をキャッシュします
function getUserById($id) {
static $cache = [];
// ユーザーのクエリの結果がすでにキャッシュにある場合,キャッシュされたデータを直接返します
if (isset($cache[$id])) {
return $cache[$id];
}
// キャッシュがない場合,データベースクエリを実行します
global $mysqli;
$query = "SELECT * FROM users WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
// クエリが成功した場合,キャッシュに保存します
if ($result) {
$row = $result->fetch_assoc();
$cache[$id] = $row; // キャッシュに保存します
return $row;
}
return null;
}
// キャッシュ付きユーザーをクエリします
$user = getUserById(1);
if ($user) {
echo "User Name: " . $user['name'];
}
?>
上記のコードでは、 GetUserByID関数は静的変数$キャッシュを使用してクエリ結果を保存します。ユーザーが最初にクエリにされると、結果は$キャッシュアレイに保存されます。その後、同じユーザーを再度クエリすると、 $キャッシュから直接取得され、データベースにアクセスしなくなります。
静的変数は単純なキャッシュに非常に効果的ですが、 Redisなどの専用のキャッシュライブラリを使用したり、複雑なアプリケーション用にMemcachedなどの専用キャッシュライブラリを使用したり、複数のリクエストでキャッシュを共有する必要がある場合にお勧めします。これらのキャッシュシステムは、分散キャッシュ、永続的なキャッシュ、およびより強力なキャッシュ管理機能を提供できます。
<?php
// 作成する Redis 接続する
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// データベース接続を作成します
$mysqli = new mysqli("localhost", "user", "password", "database");
function getUserById($id) {
global $redis, $mysqli;
// 診る Redis キャッシュされたデータはありますか
$cachedData = $redis->get("user_{$id}");
if ($cachedData) {
return unserialize($cachedData); // キャッシュからデータを取得します
}
// キャッシュがない場合,データベースクエリを実行します
$query = "SELECT * FROM users WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
// クエリが成功した場合,保存 Redis キャッシュ
if ($result) {
$row = $result->fetch_assoc();
$redis->set("user_{$id}", serialize($row), 3600); // キャッシュ1時間
return $row;
}
return null;
}
// キャッシュ付きユーザーをクエリします
$user = getUserById(1);
if ($user) {
echo "User Name: " . $user['name'];
}
?>
上記のコードでは、Redisをキャッシュストレージとして使用します。データベースを照会するとき、Redisにキャッシュされたデータが存在する場合、キャッシュ結果が直接返されます。それ以外の場合、データベースクエリが実行され、結果はRedisに保存されます。
キャッシュの重要な問題は、キャッシュの故障または更新です。データベース内のデータが変更されると、キャッシュ内のデータを同期して更新またはクリアする必要があります。一般的な戦略には以下が含まれます。
タイムリーな更新キャッシュ:キャッシュを定期的にクリアし、データベースの更新キャッシュを再クエリします。
キャッシュを手動で更新します:データが変更されたら、関連するキャッシュを手動でクリアするか、キャッシュを更新します。
RedisやMemcachedなどの静的キャッシュまたはキャッシュライブラリを使用することにより、データベースクエリの繰り返しの実行を効果的に回避し、アプリケーションのパフォーマンスを大幅に改善できます。キャッシュを実装する場合、データの精度と一貫性を確保するために、キャッシュ障害戦略を考慮する必要があります。この記事が、 mysqli_result関数のデータベースクエリを最適化する方法をよりよく理解するのに役立つことを願っています。