MySQL_Fetch_Array는 PHP를 사용하여 MySQL 데이터베이스를 조작 할 때 쿼리 결과 세트에서 행으로 데이터 행을 얻는 데 일반적으로 사용되는 기능입니다. 결과 세트가 매우 크면 mysql_fetch_array를 직접 사용하면 성능 병목 현상, 높은 메모리 발자국 및 느린 페이지 응답으로 이어질 수 있습니다. 이 기사는 특정 코드 예제를 결합하여 긴 결과 세트를 반환 할 때 성능을 효율적으로 처리하고 최적화하는 방법을 설명합니다.
mysql_fetch_array 는 결과 세트에서 데이터를 라인별로 가져 오는 것입니다. 모든 데이터를 한 번에 메모리에 읽지 않더라도 쿼리 결과 자체가 너무 커지면 여전히 많은 양의 리소스를 차지합니다.
최적화 아이디어 :
페이지 매김 쿼리, 한 번에 반환 된 데이터 금액 제한
커서 쿼리를 사용하여 데이터를 단계별로 처리하십시오
페이징은 긴 결과 세트를 처리하는 일반적인 방법입니다. 제한 및 오프셋을 통해 메모리 폭발을 피하기 위해 데이터 스트립 수는 매번 제어됩니다.
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$limit = 100; // 페이지 당 막대 수
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = ($page - 1) * $limit;
$sql = "SELECT * FROM large_table LIMIT $limit OFFSET $offset";
$result = $mysqli->query($sql);
while ($row = mysql_fetch_array($result)) {
// 각 데이터 행을 처리합니다
print_r($row);
}
?>
이렇게하면 데이터를 작은 청크로 분할하여 배치로 처리하여 서버 압력을 줄입니다.
MySQL_* 시리즈 기능은 PHP 5.5 이후 포기되었습니다. mysqli 또는 pdo를 사용하는 것이 좋습니다. 그들은 더 잘 수행하고 전처리 진술을 지원합니다.
예를 들어, mysqli_fetch_array 사용 :
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$sql = "SELECT * FROM large_table";
$result = $mysqli->query($sql);
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
// 각 데이터 행을 처리합니다
print_r($row);
}
?>
선택 * , 실제로 필요한 필드 만 쿼리하여 데이터 전송 및 메모리 소비를 줄입니다.
$sql = "SELECT id, name, email FROM large_table LIMIT 100";
쿼리 조건의 필드에 적합한 인덱스가 있고 전체 테이블 스캔을 피하고 쿼리 속도를 향상 시키는지 확인하십시오.
CREATE INDEX idx_name ON large_table(name);
데이터베이스가 지원하는 경우 커서 또는 저장 절차를 사용하여 데이터베이스 측면에서 데이터를 하나씩 처리하여 PHP 측의 메모리 사용량을 줄일 수 있습니다.
많은 양의 데이터를 처리 해야하는 스크립트의 경우 메모리 제한 및 실행 시간이 일시적으로 증가 할 수 있지만 이는 기본 솔루션이 아닌 구호 방법 일뿐입니다.
ini_set('memory_limit', '512M');
set_time_limit(300);
한 번에 모든 데이터로드를 피하거나 페이징 또는 배치 처리 우선 순위
버려진 MySQL_* 함수를 MySQLI 또는 PDO 로 교체하십시오
선택을 피하기 위해 쿼리 중에 필요한 필드 만 선택하십시오 *
데이터베이스 쿼리가 색인 지원 및 쿼리 효율성 향상 확인
서버 측 커서 또는 저장된 절차를 사용하여 PHP 압력을 줄입니다.
합리적으로 PHP 구성을 보충 최적화 측정으로 조정합니다
위의 방법을 통해 MySQL_Fetch_Array를 사용하여 긴 결과 세트를 처리하는 성능과 효율성을 크게 향상시킬 수 있습니다.