(mysqlnd를 사용하여) 임의의 다중 명령문 SQL을 Mysqli에 전달하고 결과 집합을 검색합니다. SELECT 문은 LIMIT
절을 포함 할 수도 있고 포함하지 않을 수도 있습니다. 내가 필요한 건 가져온 행을 1000 (하드 코드 된 한계)으로 제한하는 것입니다. 그게 내가 가진거야 :Mysqli : use_result 이후의 행 건너 뛰기
define('SAFE_ROWS', 1000); // strict limit
$sql = "SELECT * FROM table1 LIMIT 99999999";
$mysqli->multi_query($sql);
// unbuffered: results are stored at MySQL-side
// and transfer when i call fetch*
$result = $mysqli->use_result();
$rows = [];
while ($row = $result->fetch_array()) {
if (count($rows) >= SAFE_ROWS) {
#############################################
# QUESTION: what i have to do here #
# to skip remaining rows of current result? #
#############################################
break;
}
$rows[] = $row;
}
// As slow as much rows remained unfetched:
$result->free();
현재 결과 내에 페치되지 않은 행이 많으면 해제하는 데 너무 많은 시간이 걸린다. MySQL에게 "이 결과의 나머지 행이 더 이상 필요하지 않고 그냥 묻어 버릴 필요가 없다"고 말할 수있는 방법이 있습니까?
추신. SQL_SELECT_LIMIT
옵션에 대해 알고 있지만 선택 제한이 분명히 설정되어 있으면이 제한이 무시됩니다 (SELECT * FROM t1 LIMIT 99999999
).
실제로 코드를 벤치 마크하고 '자유'가 문제인지 결정 했습니까? 또한 모든 반복에서 배열을 계산하지 않고 루프에서 증가하는 카운터 변수를 갖는 것이 좋습니다. – KillerX
@YourCommonSense 특히이 질문에 대답하는 (또는 오히려 주석을 달아주는)보다 적절한 사용자 이름을 본 적이 없습니다. – Andrew
질문을 표현하기 위해 코드를 단순화했습니다. 실제로 select/insert/update 문을 여러 개 포함 할 수있는 다른 SQL을 실행합니다. 또한 각 반복마다 요소를 계산하지 않습니다. 물론 간단한 코드 만 보여주고 싶습니다. @KillerX, 예, 각 코드 블록의 평가 시간을 확인했습니다. – Bars