데이터베이스 쿼리를 처리 할 때 PHP가 발생하면 결과 세트의 열에만 관심이 있으면 mysqli_result :: fetch_column ()을 사용하여 매우 효율적인 방법입니다. 이 접근법은 기존의 fetch_assoc () 또는 fetch_row () 보다 메모리 절약이 더 많으며 특히 많은 양의 데이터를 처리 할 때 더 잘 수행됩니다. 이 기사는 PHP 프로그램의 전반적인 성능을 향상시키기 위해 Fetch_column ()을 사용하는 동안 메모리 사용량을 추가로 최적화하는 방법을 살펴 봅니다.
메모리를 최적화하는 가장 직접적이고 효율적인 방법 중 하나는 select *를 사용하는 대신 SQL 쿼리에서 실제로 필요한 열만 선택하는 것입니다. 예를 들어:
$result = $mysqli->query("SELECT username FROM users");
이렇게하면 데이터베이스 서버가 PHP로 전송 한 데이터 양을 줄이고 소스에서 메모리 소비를 줄일 수 있습니다.
fetch_assoc ()는 연관 배열을 반환하고, fetch_row ()는 인덱스 배열을 반환하고 fetch_column ()은 단일 값을 직접 반환합니다.
while ($username = $result->fetch_column()) {
// 거래하십시오$username
}
이 방법은 불필요한 배열 캡슐화를 피하고 메모리 할당을 줄입니다. 특히 특정 데이터 열만 필요한 시나리오에 대해.
일반적인 관행은 먼저 모든 결과를 배열로 캐시 한 다음 처리하는 것입니다.
$usernames = [];
while ($username = $result->fetch_column()) {
$usernames[] = $username;
}
데이터 볼륨이 크면 많은 양의 메모리 사용이 발생할 수 있습니다. 처리 로직이 허용되면 모든 데이터를 한 번에로드하지 않고 읽는 동안 읽고 처리하십시오.
while ($username = $result->fetch_column()) {
process_username($username); // 假设是某个거래하십시오函数
}
기본적으로 mysqli_query ()는 클라이언트 메모리에서 모든 결과를 캐시합니다. 데이터 볼륨이 특히 큰 경우 MySQLI_USE_RESULT 상수를 사용하여 부러지는 쿼리를 활성화 할 수 있습니다.
$result = $mysqli->query("SELECT username FROM users", MYSQLI_USE_RESULT);
이 방법은 모든 결과를 메모리에로드하지는 않지만 한 번에 서버에서 한 줄의 데이터를 얻어 더 많은 메모리를 저장합니다. 그러나 부패하지 않은 결과 세트는 처리 전에 다른 쿼리를 실행할 수 없습니다.
PHP 스크립트 자체가 고로드 작업 (예 : 다량의 데이터 추출)을 수행하는 경우, 메모리 오버플로를 방지하고 너무 높고 폐기물 시스템 자원을 설정하지 않도록 php.ini 의 memory_limit이 합리적으로 설정되어 있는지 확인하십시오. 다음 방법으로 동적으로 설정할 수 있습니다.
ini_set('memory_limit', '128M');
그러나 단순히 메모리 캡을 늘리는 대신 프로그램 로직을 최적화하는 것이 좋습니다.
여러 열 값을 반환 해야하는 함수의 경우 발전기가 지연된 하중의 효과와 결합 될 수 있습니다.
function get_usernames(mysqli_result $result): Generator {
while ($username = $result->fetch_column()) {
yield $username;
}
}
// 사용
foreach (get_usernames($result) as $username) {
process_username($username);
}
생성기의 장점은 모든 데이터를 한 번에 메모리에로드하지 않으므로 큰 결과 세트를 처리하는 데 특히 적합하다는 것입니다.
mysqli_result :: fetch_column () 자체를 사용하는 것은 메모리 최적화 관행이지만, 필요한 필드 만 쿼리하고, 처리하는 동안 데이터 추출, 부러지는 쿼리 및 생성기를 사용하는 것과 같은 다른 기술과 결합하여 PHP 프로그램의 메모리 소비를 줄이고 성능을 향상시킬 수 있습니다. 이러한 최적화 방법은 데이터 볼륨이 큰 처리에 특히 중요합니다.
데이터베이스와 상호 작용하는 고성능 PHP에 대한보다 실용적인 경험은 https://gitbox.net/php-db-optimization 에서 찾을 수 있습니다.