2017-11-10 8 views
-1

(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).

+0

실제로 코드를 벤치 마크하고 '자유'가 문제인지 결정 했습니까? 또한 모든 반복에서 배열을 계산하지 않고 루프에서 증가하는 카운터 변수를 갖는 것이 좋습니다. – KillerX

+1

@YourCommonSense 특히이 질문에 대답하는 (또는 오히려 주석을 달아주는)보다 적절한 사용자 이름을 본 적이 없습니다. – Andrew

+0

질문을 표현하기 위해 코드를 단순화했습니다. 실제로 select/insert/update 문을 여러 개 포함 할 수있는 다른 SQL을 실행합니다. 또한 각 반복마다 요소를 계산하지 않습니다. 물론 간단한 코드 만 보여주고 싶습니다. @KillerX, 예, 각 코드 블록의 평가 시간을 확인했습니다. – Bars

답변

5

당신이하려는 일은야만 행위라고합니다.
그리고 쿼리 결과를 버리는 것이 문제가 아닙니다. 나는 캠프 파이어가 필요

자신에게 차 한잔을 끓여 : 평신도의 관점에서

귀하의 질문은 많은 같은입니다. 몇 줄기를 잘라내는 것은 너무 많은 작업입니다. 나는 다이너마이트 톤을 가지고 있었기 때문에 숲 전체를 날려 버렸습니다. 이건 괜찮 았어, 내 모닥불은 완벽했다. 하지만 지금은 그 쓰레기를 다 누울 필요가 없습니다. 나는 그것을 어떻게 연기가 나면서 사라지게 할 수 있는가?

그리고 여기서 중요한 문제는 더 이상 존재하지 않는 숲입니다.

당신의 아이디어로 당신은 똑같이하고 있습니다. PHP와 MySQL 측면 모두에서 많은 리소스를 낭비하고 있습니다. 따라서 MySQL 서버에서 많은 행을로드해야 할 때가 있습니다. 그리고 결과 집합을 지우는 데 걸리는 시간조차도 당신이 뭔가 잘못하고 있다는 것을 암시하지 않습니다.

좋습니다. 몇 초 내에 몇 기가 바이트의 데이터를 버리는 마술적인 방법을 발견하게 될 것입니다. 그러나이 기가 바이트는 먼저 모아야합니다. 수제 수제 phpmyadmin으로 데이터베이스 서버를 죽이면 사용자가 예상 한만큼 감사하지 않게됩니다.

이제 삭제 된 설명에 "다른 phpmyadmin 작업 중"이라고 명시하셨습니다. 따라서 phpmyadmin이하는 일을 수행하십시오 - SQL을 구문 분석하고 쿼리에 LIMIT 부분을 추가하십시오.

+0

나는 자신이 한계를 선언하지 않으면 SQL_SELECT_LIMIT을 사용하여 테이블의 모든 행을 선택하지 못하게했습니다. mysql (use_result)에서 전달 된 전체 결과를 가져 오지는 않지만 행 단위로 페치 (또한 PHP 측의 행 개수 제어)합니다. 따라서 PHP는 너무 많은 메모리를 사용하지 않습니다 (버퍼되지 않은 쿼리 사용). 사용자가 너무 큰 제한을 설정하면 메모리 할당을 빠르게 할 수 있습니다.과도한 행은 Mysql에 저장되어 있으며 사실입니다. 이해하지만 PHP로 전송되지 않습니다. 당신의 새로운 대답은 매우 재미 있습니다, 하하. 이전의 "아니오"가 훨씬 도움이되었습니다. – Bars