현재 위치: > 최신 기사 목록> 큰 데이터 볼륨의 결과 세트를 처리하는 방법 : 스트리밍 읽기

큰 데이터 볼륨의 결과 세트를 처리하는 방법 : 스트리밍 읽기

M66 2025-05-17

PHP 애플리케이션을 개발할 때, 특히 많은 양의 데이터를 처리 할 때 데이터베이스에서 데이터를 효과적으로 가져오고 메모리 오버 플로우를 방지하는 방법은 일반적이고 중요한 문제입니다. MySQLI_RESULT 는 쿼리 결과를 처리하는 데 PHP에서 사용되는 일반적인 기능 중 하나이지만 많은 양의 데이터에 직면하면 스트리밍 판독 값을 사용하지 않으면 과도한 메모리 사용이 발생하여 메모리 오버 플로우 문제가 발생합니다.

이 기사는 MySQLI_RESULT 기능 및 스트리밍 읽기 기술을 사용하여 메모리 오버플로를 피하기 위해 큰 데이터 볼륨의 결과 세트를 효과적으로 처리하는 방법을 소개합니다.

스트리밍 읽기 란 무엇입니까?

스트리밍 판독 값은 모든 결과를 메모리에 한 번에로드하는 대신 데이터 라인별로 읽는 것을 말합니다. 스트리밍 읽기를 통해 일회성로드에 적합하지 않은 데이터 세트를 처리하여 과도한 메모리 사용의 위험을 피할 수 있습니다. 스트리밍 읽기는 특히 큰 데이터 볼륨을 쿼리 할 때 특히 유용합니다.

mysqli_result 스트리밍 읽기 기능을 제공합니다. mysqli_use_result를 사용하여 쿼리를 실행하고 결과 세트를 라인별로 처리 할 수 ​​있습니다. MySQLI_STORE_RESULT 와 달리 후자는 모든 데이터를 메모리에로드하는 반면 MySQLI_USE_RESULT는 서버의 데이터를 라인별로 읽으므로 메모리 사용량을 크게 줄일 수 있습니다.

mysqli_result 함수를 사용하여 데이터를 스트리밍하십시오

처리 해야하는 데이터베이스 쿼리가 있다고 가정하여 많은 양의 데이터를 반환합니다. 다음은 스트리밍 읽기를 사용하여 데이터를 처리하는 방법을 보여주는 간단한 코드 예입니다.

 <?php
// 데이터베이스 연결 구성
$host = 'localhost';
$user = 'root';
$password = 'password';
$dbname = 'example_database';

// 데이터베이스 연결을 만듭니다
$conn = new mysqli($host, $user, $password, $dbname);

// 연결이 성공했는지 확인하십시오
if ($conn->connect_error) {
    die("연결이 실패했습니다: " . $conn->connect_error);
}

// 쿼리를 실행하십시오,사용 MYSQLI_USE_RESULT 스트리밍 읽기를 수행하십시오
$query = "SELECT id, name, email FROM users WHERE status = 'active'";
$result = $conn->query($query, MYSQLI_USE_RESULT);

// 쿼리가 성공했는지 확인하십시오
if ($result === false) {
    die("쿼리가 실패했습니다: " . $conn->error);
}

// 데이터 루프를 읽으십시오
while ($row = $result->fetch_assoc()) {
    // 각 데이터 행을 처리합니다
    echo "ID: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . "<br>";
}

// 쿼리 결과를 릴리스합니다
$result->free();

// 데이터베이스 연결을 닫습니다
$conn->close();
?>

코드 구문 분석 :

  1. 데이터베이스 연결 : 먼저 MySQL 데이터베이스와 연결을 생성했습니다.

  2. 쿼리 실행 : 쿼리를 실행할 때 MySQLI_USE_RESULT를 두 번째 매개 변수로 사용했습니다. 이러한 방식으로 결과 세트는 한 번에 메모리에로드되지 않지만 필요에 따라 데이터베이스에서 데이터를 라인별로 가져옵니다.

  3. 라인별로 읽기 : fetch_assoc () 메소드를 통해 쿼리 결과를 한 줄씩 읽고 각 데이터 행을 처리합니다.

  4. 릴리스 리소스 : 데이터를 처리 한 후 Free ()를 호출하여 결과 세트 리소스를 해제하십시오.

  5. 연결을 닫으십시오 : 마지막으로 데이터베이스 연결을 닫으십시오.

위의 코드를 통해 특히 쿼리 결과 세트가 매우 큰 경우 메모리 오버플로의 위험을 효과적으로 피할 수 있습니다.

스트리밍 읽기 최적화를위한 팁

특히 결과 세트 데이터가 매우 큰 경우 스트리밍 읽기 동안 성능을 더 최적화하는 데 도움이되는 몇 가지 팁이 있습니다.

  1. 쿼리의 결과 세트 크기 제한 : 페이징을 통해 각 쿼리의 결과 세트 크기를 제한 할 수 있습니다. 예를 들어, 한계를 사용하여 쿼리 결과 수를 제한하고 배치로 데이터를 읽을 수 있습니다. 예를 들어:

     $offset = 0;
    $limit = 1000;
    $query = "SELECT id, name, email FROM users WHERE status = 'active' LIMIT $offset, $limit";
    

    오프셋제한을 조정하여 한 번에 많은 양의 데이터를 읽음으로써 메모리 오버플로를 피하기 위해 배치로 데이터를 읽을 수 있습니다.

  2. 인덱스 최적화 : 데이터베이스의 관련 테이블에 적절한 색인이 있는지 확인하여 쿼리가 더 효율적이고 데이터베이스 판독의 부담을 줄일 수 있습니다.

  3. 단계별 데이터 프로세스 : 데이터를 읽을 때 데이터를 단계별로 처리하고 더 이상 시간이 필요하지 않은 메모리를 자유롭게 할 수 있습니다. 예를 들어, 데이터 처리에 파일 작업이 포함되면 모든 데이터를 메모리에 유지하는 대신 처리 된 모든 양의 데이터에 대해 파일에 쓸 수 있습니다.

  4. 백그라운드 작업 처리 : 매우 큰 데이터 세트의 경우 작업을 백그라운드 실행으로 전송하는 것을 고려할 수 있습니다. 예를 들어, 대기열 시스템 (예 : RabbitMQ)을 사용하거나 비동기 처리를 위해 작업을 여러 배치로 나눕니다.

결론

스트리밍 읽기와 함께 mysqli_result 기능을 사용하면 큰 데이터 세트를 처리 할 때 메모리 오버플로 문제를 효과적으로 피할 수 있습니다. 합리적인 쿼리 설계, 스트리밍 읽기 및 페이징 기술을 통해 시스템 성능 및 안정성을 유지하면서 PHP에서 대규모 데이터 세트를 효율적으로 처리 할 수 ​​있습니다.

이 기사에 제공된 팁이 실제 개발에서 대규모 데이터 쿼리 결과 세트를 더 잘 처리하고 응용 프로그램 안정성 및 효율성을 향상시키는 데 도움이되기를 바랍니다.