PHP에서 pdostatement :: FetchObject는 데이터베이스에서 데이터를 얻는 데 일반적으로 사용되는 방법입니다. 일반적 으로이 방법을 사용하여 데이터 행을 행으로 행하거나 배치로 배치합니다. 그러나 경우에 따라 쿼리를 여러 번 실행할 때 중복 쿼리가 발생하여 성능 문제가 발생할 수 있습니다. 이를 피하기 위해 다른 방법을 통해 쿼리를 최적화하여 쿼리 된 데이터가 반복되지 않도록 할 수 있습니다.
이 기사는 Pdostatement :: FetchObject를 사용할 때 중복 쿼리를 피하는 방법을 설명하기 위해 예제를 사용하여 데이터를 여러 번 가져오고 일반적으로 사용되는 일부 최적화 전략을 제공합니다.
첫째, pdostatement :: FetchObject 메소드가 어떻게 작동하는지 이해하는 것이 매우 중요합니다. 이 메소드는 현재 결과 행의 객체 표현을 반환하고 호출 할 때마다 포인터를 다음 행으로 이동합니다. 일반적인 사용법은 다음과 같습니다.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT id, name FROM users");
$stmt->execute();
while ($user = $stmt->fetchObject()) {
echo $user->id . ' - ' . $user->name . "<br>";
}
?>
위의 코드는 쿼리를 실행하고 데이터를 라인별로 출력합니다. FetchObject ()가 호출 될 때마다 요청이 데이터베이스에 시작됩니다.
여러 위치에서 FetchObject를 호출 할 수있는 더 복잡한 쿼리 로직이 있다고 가정 해 봅시다. 예를 들어, 일부 사용자 데이터는 여러 페이지 또는 작업에서 검색되어야하며, 매번 데이터베이스가 필요한 경우 성능에 영향을 미칩니다.
최적화하는 한 가지 방법은 캐시를 사용하여 중복 쿼리를 피하는 것입니다. 데이터를 처음으로 쿼리 할 때 결과를 메모리에 캐시 할 수 있습니다 (예 : APCU 또는 MEMCACHED 와 같은 캐시 메커니즘을 통해). 후속 요청에서 데이터베이스를 다시 쿼리하지 않고 캐시에서 데이터를 직접 검색 할 수 있습니다.
예를 들어 APCU 캐시를 사용한 간단한 구현 :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT id, name FROM users");
$stmt->execute();
while ($user = $stmt->fetchObject()) {
// 사용 APCu 은닉처
$cacheKey = 'user_' . $user->id;
if (!apcu_exists($cacheKey)) {
apcu_store($cacheKey, $user);
}
$cachedUser = apcu_fetch($cacheKey);
echo $cachedUser->id . ' - ' . $cachedUser->name . "<br>";
}
?>
이 예에서는 APCU를 사용하여 각 사용자 객체를 캐시합니다. 데이터가 캐시 된 경우 데이터베이스의 재 퀴즈 대신 캐시 된 데이터를 직접 사용하십시오.
쿼리가 많은 양의 데이터를 반환하면 다른 최적화 전략은 Pagination Queries를 사용하는 것입니다. 쿼리 결과를 배치로로드하면 한 번에 너무 많은 데이터를로드하지 않아 여러 쿼리가 발생할 수 있습니다.
페이지 매김 쿼리의 예는 다음과 같습니다.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$limit = 10; // 각 쿼리10데이터
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $limit;
$stmt = $pdo->prepare("SELECT id, name FROM users LIMIT :limit OFFSET :offset");
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
while ($user = $stmt->fetchObject()) {
echo $user->id . ' - ' . $user->name . "<br>";
}
?>
이 예에서 제한 및 오프셋은 페이지 매김 쿼리에 사용되므로 필요한 데이터의 일부만 한 번에로드하는 것이 아니라 한 번에로드되도록합니다.
동일한 스크립트에서 동일한 쿼리 결과가 여러 번 필요한 경우 쿼리 결과를 여러 번 호출하는 대신 쿼리 결과를 변수로 고려하십시오. 예를 들어:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT id, name FROM users");
$stmt->execute();
$users = [];
while ($user = $stmt->fetchObject()) {
$users[] = $user;
}
// 后续사용已经加载的用户数据,다시 쿼리없이
foreach ($users as $user) {
echo $user->id . ' - ' . $user->name . "<br>";
}
?>
여기에서는 쿼리 결과를 $ 사용자 배열에 저장하여 후속 코드에서 데이터베이스의 반복 쿼리를 피합니다.
캐싱 및 페이징 외에도 다음은 일반적으로 사용되는 최적화 전략입니다.
선택 * 사용하지 마십시오 * : 데이터 전송을 줄이기 위해 필요한 필드 만 선택하십시오.
배치 쿼리 : 여러 레코드를 한 번에 쿼리하지 않고 한 번에 여러 레코드를 쿼리하십시오.
색인 사용 : 데이터베이스 테이블의 관련 필드에 쿼리 효율성을 향상시키기 위해 적절한 인덱스가 있는지 확인하십시오.