2010-01-09 4 views
0

나는 일부 데이터베이스 (MySQL의) 래퍼 클래스, 그들 중 많은이 같은 직장에서 찾고,
1) SQL 쿼리를 실행
2) 연관 MySQL의 배열을 가져 오는 동안, 그들은 결과를 통해 cyle과 그들을 거기에 추가 자신의 배열
3) 다음 그것의 배열PHP 클래스를 사용하여 이처럼 mysql 쿼리를 실행합니까?

<?php 
$database = new Database(); 

$result = $database->query('SELECT * FROM user;'); 

foreach ($result as $user){ 
    echo $user->username; 
} 

?> 

을 통해 아래이 사이클 같은 클래스를 실행하는 것입니다 그래서 여기 내 질문이 높은 트래픽 유형의 사이트에 좋지입니까? 내가 말할 수있는 한, mysql은 메모리를 먹는 배열을 리턴하고, 그 배열로부터 새로운 배열을 만들고 나서 새로운 배열을 순환하고 있기 때문이다. 이것은 좋지 않거나 꽤 정상입니까?

+0

트래픽이 많은 사이트에서 정확하지 않습니다. hight 트래픽 사이트의 경우 항상 자신의 롤 또는 그것의 하드웨어를 많이 던져 최고의. – DeveloperChris

답변

3

짧은 대답은 다음과 같습니다.

결과가 두 번 반복되면 성능이 저하됩니다 (순환 및 메모리!). (1000 개의 행이 반환되면 모든 데이터를 가져 와서 1000 번 반복하고 메모리에 모두 저장 한 다음 다시 반복하십시오).

클래스를 약간 리팩토링하면 여전히 쿼리와 페치를 래핑 할 수 있지만 fetch_array를 쿼리 외부에서 수행하려고합니다. 이 경우 완료된 즉시 메모리에서 각 행을 삭제할 수 있으므로 전체 결과 집합을 저장할 필요가 없으며 한 번만 반복 할 수 있습니다.

IIRC, PHP는 기본적으로 mysql_fetch_array를 호출 할 때 집합에있는 다음 행을 요청할 때 요청하는 경우에만로드되므로, 원래 쿼리를 실행하여 전체 세트 (PHP 측)에 대한 메모리 적중률을 지불하지 마십시오. mysql_query (감사합니다 VolkerK)를 사용할 때 전체 결과가 메모리에로드되지만, 여전히 CPU 비용을 두 번 지불하면 상당한 페널티가 발생할 수 있습니다.

+0

mysql \ _query()는 반환하기 전에 전체 결과 집합을 PHP 프로세스 메모리로 전송합니다. mysql \ _unbuffer \ _query()는 반환하지 않습니다. – VolkerK

+0

이것은 내가 생각한 것입니다. 이것은 내 코드가 아니기 때문에 내가 묻는 이유입니다. 나는 그것을 두 번 수행하는 것이 좋지 않다고 생각했지만 DB 클래스에서 꽤 자주 볼 수 있습니다. 이유는 궁금합니다. – JasonDavis

+0

개인적으로 나는 원하는 데이터를 얻고 배열로 옮겨 모든 DB 작업을 깔끔하게 처리 할 수 ​​있습니다. try/catch 블록으로 래핑됩니다. 또한, 이러한 우려의 분리를 향상시킵니다. 'while ($ row = $ mysql_fetch_row())'또는 DB 명령과 디스플레이 로직을 섞어서 사용하십시오. – JAL

0

코드는 정상입니다.

foreach()는 각 패스에서 배열 포인터를 이동합니다.

당신은 여기에 대해 모든 것을 읽을 수 있습니다 : 깊은 이해에 대한

http://php.net/foreach

, C에서 포인터 작업 방법에 대해 살펴 :

http://home.netcom.com/~tjensen/ptr/ch2x.htm

아무것도 복사되지는 반복이 거의입니다 항상 포인터를 증가시킴으로써 수행됩니다.

0

이러한 종류의 쿼리는 거의 정상입니다. 가능하다면 한 번에 한 행만 가져 오는 것이 좋습니다. 그러나 작고 페이지가 지정된 쿼리에 사용할 수있는 보통 크기의 작은 데이터 집합의 경우 여분의 메모리 사용량이 중요하지 않습니다.

SELECT * FROM user 그러나 사용자가 많고 각 사용자 행에 많은 정보가있는 경우 대용량 데이터 세트를 확실히 생성 할 수 있습니다. 선택한 열과 행 수를 최소로 유지하면서 실제로 페이지에 넣을 정보를 유지하십시오.

관련 문제