데이터베이스 작업에 PHP 및 MySQL을 사용할 때 많은 개발자가 문제가 발생했을 수 있습니다. 여러 SQL 문을 실행할 때 mysqli :: next_result ()가 필요 하며이 기능은 종종 "쿼리 속도 속도 속도 속도가 느려집니다"? 오늘 우리는 당신이 진실을 이해하는 데 도움이되는이 문제의 내부를 탐구 할 것입니다.
mysqli_multi_query ()를 사용하여 여러 SQL 문을 실행할 때 각 문의 결과를 수동으로 처리해야합니다. 현재 Next_result () 의 기능은 다음 SQL 문의 결과 세트로 내부 포인터를 이동하는 것입니다.
$conn = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($conn->multi_query($sql)) {
do {
if ($result = $conn->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($conn->next_result());
}
next_result () 는 본질적으로 쿼리를 실행하는 것이 아니라 MySQLI 클라이언트에게 "서버에서 다음 결과를 얻을 수 있다고"알립니다. 주 시간 소비는 다음과 같습니다.
네트워크 대기 시간 (클라이언트 서버 통신)
큰 데이터 볼륨 (결과 세트가 클 때 메모리가 소비됩니다)
비 필수 처리 (처리되지 않은 결과를 청소해야합니다)
따라서 쿼리 자체가 이미 빠르면 Next_Result () 로의 호출은 거의 무시할 수 있습니다. 그러나 쿼리가 다량의 데이터를 생성하는 경우 결과 세트의 각 이동은 이전 결과를 구문 분석하고 해제해야하므로 실제로 추가 오버 헤드를 발생시킬 수 있습니다.
테스트에서 다음과 같은 다중 쿼리 문을 실행한다고 가정합니다.
$sql = "
SELECT * FROM big_table_1;
SELECT * FROM big_table_2;
SELECT * FROM big_table_3;
";
각 테이블의 데이터 볼륨은 약 50,000 행입니다.
두 세트의 테스트를 수행합니다.
A : multi_query () + next_result ()를 사용하여 각 결과를 정상적으로 구문 분석합니다.
B : multi_query ()를 사용하지만 첫 번째 결과 만 찍히고 나머지는 무시됩니다.
통계는 다음과 같습니다 (초) :
모델 | 실행 시간 |
---|---|
에이 | 0.82S |
비 | 0.48S |
보시다시피, 후속 결과 세트가 필요하지 않으면 Next_result () 에게 전화하지 않으면 더 빠릅니다. 그러나이 데이터를 얻을 필요가있는 한 필수 불가결합니다.
한 명령문의 쿼리 결과 만 필요하면 multi_query ()를 사용하지 마십시오.
// 더 권장되는 방법
$result = $conn->query("SELECT * FROM users");
multi_query ()를 사용할 때는 각 쿼리 문에서 반환 된 데이터 양을 가능한 한 많이 제어하십시오. 예를 들어, 필요한 필드 만 선택하거나 한도를 사용하여 숫자를 제한합니다.
SELECT id, name FROM users LIMIT 100;
특히 루프에 사용될 때 메모리 축적을 방지하려면 store_result () 후 $ result-> free () 에게 전화하십시오.
next_result () 자체는 "쿼리 속도를 늦추지 않고"프로세스의 일부일뿐입니다.
속도에 실제로 영향을 미치는 것은 데이터의 양과 실제로 모든 결과가 필요한지 여부입니다.
하나의 쿼리 만 있으면 Multi_Query ()를 피하십시오.
여러 결과 처리가 필요한 경우 Next_result ()가 좋은 도우미입니다.
보다 심층적 인 성능 분석을 보려면 https://gitbox.net/articles/db-performance 의 자세한 비교 보고서를 방문하십시오.