현재 위치: > 최신 기사 목록> 빅 데이터를 처리 할 때 pdostatement의 성능 병목 현상 문제를 해결하는 방법 :: FetchObject 기능은 무엇입니까?

빅 데이터를 처리 할 때 pdostatement의 성능 병목 현상 문제를 해결하는 방법 :: FetchObject 기능은 무엇입니까?

gitbox 2025-05-12

PHP 응용 프로그램을 개발할 때는 PDO를 사용하여 데이터베이스와 상호 작용하는 것이 일반적인 관행이되었습니다. pdostatement :: FetchObject는 쿼리 결과를 라인별로 객체 행으로 변환하여보다 쉽게 ​​작동 할 수있는 매우 유용한 기능입니다. 그러나 많은 양의 데이터를 처리 할 때 FetchObject 함수는 성능 병목 현상을 일으켜 처리가 느려질 수 있습니다. 이 기사는 빅 데이터를 다룰 때 PDO의 성능 문제를 해결하는 데 도움이되는 몇 가지 최적화 팁을 논의합니다.

1. 문제 분석

pdostatement :: fetchObject를 사용할 때 PHP는 각 데이터베이스 행이 객체에 맵핑됩니다. 이 작업은 대부분의 경우 잘 수행되지만 데이터 볼륨이 매우 크면 다음과 같은 문제가 발생합니다.

  • 높은 메모리 발자국 : FetchObject가 호출 될 때마다 많은 메모리를 소비하는 객체가 생성됩니다.

  • 느린 응답 : 대형 데이터 세트에서 행으로 행을 읽고 객체에 매핑하는 것은 특히 데이터의 양이 수만 행에 도달 할 때 매우 느리게 나타날 수 있습니다.

  • 데이터베이스 연결이 오랜 시간이 걸립니다 . 쿼리가 제대로 최적화되지 않으면 너무 긴 실행 시간이 요청을 시간 초과 할 수 있습니다.

성능을 최적화하기 위해 이러한 병목 현상을 피하기위한 몇 가지 단계를 수행 할 수 있으며 몇 가지 일반적인 솔루션이 있습니다.

2. 솔루션을 최적화하십시오

2.1 pdo :: fetch_obj 대신 pdo :: fetch_assoc 을 사용하십시오

pdostatement :: fetchObject는 쿼리 결과를 객체로 변환합니다. 이 방법은 객체 지향 프로그래밍 스타일과 더 일치하지만 많은 객체를 생성하면 빅 데이터를 처리 할 때 불필요한 오버 헤드를 가져올 수 있습니다. 데이터베이스 필드에 액세스하기 만하면 pdo :: fetch_assoc을 사용하는 것이 더 효율적 일 수 있으며, 이는 각 행 결과를 객체가 아닌 연관 배열로 반환합니다.

샘플 코드 :

 <?php
// 만들다 PDO 예
$pdo = new PDO('mysql:host=gitbox.net;dbname=test', 'username', 'password');

// 쿼리를 실행하십시오
$stmt = $pdo->query('SELECT * FROM large_table');

// 사용 FETCH_ASSOC 바꾸다 FETCH_OBJ
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // 처리 데이터
    echo $row['column_name'] . "\n";
}
?>

이런 식으로, 우리는 각 데이터 행에 대한 객체를 만들지 않아 메모리 사용을 줄입니다.

2.2 배치로 데이터를 쿼리하려면 한계를 사용하십시오

한 번에 많은 양의 데이터를 쿼리하면 데이터베이스 및 응용 프로그램의 성능에 큰 영향을 줄 수 있습니다. 효과적인 접근 방식은 한계를 사용하여 배치로 데이터를 쿼리하는 것입니다. 이 방법은 대형 데이터 세트를 여러 개의 작은 배치로 나눌 수 있고로드 및 처리하여 한 번에 과도한 데이터로드를 피할 수 있습니다.

샘플 코드 :

 <?php
$pdo = new PDO('mysql:host=gitbox.net;dbname=test', 'username', 'password');
$batchSize = 1000;  // 각 쿼리1000데이터
$offset = 0;

do {
    $stmt = $pdo->prepare('SELECT * FROM large_table LIMIT :limit OFFSET :offset');
    $stmt->bindValue(':limit', $batchSize, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();

    // 각 데이터 배치를 처리합니다
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo $row['column_name'] . "\n";
    }

    $offset += $batchSize;
} while ($stmt->rowCount() > 0);  // 아직 데이터가있는 경우,계속 쿼리합시다
?>

이러한 방식으로 시스템은 한 번에 한 번에 작은 부분 만로드하여 메모리 압력을 크게 줄일 수 있습니다.

2.3 PDO :: Fetch_Bound를 사용한 바인딩 변수

성능을 향상시키는 또 다른 방법은 pdo :: fetch_bound를 사용하는 것입니다.이를 통해 쿼리 결과를 PHP 변수에 직접 바인딩하여 중간 배열 또는 객체를 생성하지 않습니다. 이것은 특히 데이터 볼륨이 매우 큰 경우 매번 FetchObject 또는 FetchAssoc을 호출하는 것보다 더 효율적입니다.

샘플 코드 :

 <?php
$pdo = new PDO('mysql:host=gitbox.net;dbname=test', 'username', 'password');

$stmt = $pdo->query('SELECT id, name FROM large_table');
$stmt->bindColumn('id', $id);
$stmt->bindColumn('name', $name);

while ($stmt->fetch(PDO::FETCH_BOUND)) {
    echo "ID: $id, Name: $name\n";
}
?>

이런 식으로, 페치가 호출 될 때마다, ID이름 의 값은 추가 메모리 오버 헤드없이 변수 $ id$ 이름 에 직접 바인딩되어 배열 또는 객체를 생성합니다.

2.4 지속적인 연결 및 연결 풀 사용

고주파 및 대형 데이터 작업의 경우 데이터베이스 연결의 오버 헤드도 무시할 수없는 문제입니다. 연결 시설 및 파괴로 인한 시간 소비를 줄이기 위해 지속적인 연결 또는 연결 풀링 기술을 사용하는 것을 고려할 수 있습니다.

 <?php
$pdo = new PDO('mysql:host=gitbox.net;dbname=test', 'username', 'password', [
    PDO::ATTR_PERSISTENT => true,  // 지속적인 연결을 활성화합니다
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

// 후속 데이터베이스 작업
?>

여러 요청에 따라 지속적인 연결을 재사용 할 수있어 데이터베이스 연결의 빈번한 생성 및 파괴의 오버 헤드를 줄이고 전반적인 성능을 향상시킵니다.

3. 요약

pdostatement :: FetchObject 함수를 사용할 때 : 성능을 최적화 할 수 있습니다.

  • 불필요한 객체 생성을 피하려면 pdo :: fetch_obj 대신 pdo :: fetch_assoc 을 사용하십시오.

  • 쿼리 당 데이터 양을 줄이기 위해 배치로 데이터를 쿼리합니다.

  • pdo :: fetch_bound를 사용하여 쿼리 결과를 변수에 직접 바인딩하십시오.

  • 데이터베이스 연결 오버 헤드를 줄이기 위해 지속적인 연결을 활성화합니다.

이러한 최적화 방법을 통해 대형 데이터 쿼리 중 성능을 효과적으로 개선하고 메모리 사용을 줄이고 응답 속도를 향상시킬 수 있습니다. 성능 병목 현상이 발생하면 이러한 방법을 시도하여 데이터베이스 작업을 최적화하십시오.