특히 데이터베이스 작업과 관련된 프로젝트에서 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 함수는 정적 변수 $ $ 캐시를 사용하여 쿼리 결과를 저장합니다. 사용자가 먼저 쿼리되면 결과는 $ 캐시 어레이에 저장됩니다. 그 후, 동일한 사용자를 다시 쿼리 할 때 $ Cache 에서 직접 검색되고 더 이상 데이터베이스에 액세스되지 않습니다.
정적 변수는 간단한 캐시에 매우 효과적이지만 복잡한 응용 프로그램을 위해 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 함수의 데이터베이스 쿼리를 최적화하는 방법을 더 잘 이해하는 데 도움이되기를 바랍니다.