2012-07-27 2 views
2

저는 현재 우리 사이트에 저장된 이미지를 조정하고 있습니다. 모든 사용자에 대해 프로필 이미지가 있는지 찾고 있는데 폴더 구조에 파일이 있는지 확인하여이 작업을 수행합니다.이 작업은 DB 테이블의 이미지 이름 저장/검색 속도가 빠릅니다. ?,더 빠를 file_exists 또는 DB 검색?

내보기에서
$gender = ($gender == 1) ? 'female' : 'male'; 

$filename = SITE_ROOT . $this->img_url . $user_id . 'medium_thumb.jpg'; 

if (file_exists($filename)) { 
    $filename = $this->img_url . $user_id . 'medium_thumb.jpg?v=' . time(); 
} 
else { 
    $filename = '/images/'.$gender.'.jpg'; 
}  

return $filename 
+2

필자의 경험에 비추어 말하면 db는 파일 시스템과 이야기하는 것보다 시간이 더 걸린다. – Leri

+3

답변을 얻는 유일한 방법은 벤치 마크를 설정하고 직접 테스트하는 것입니다. 트래픽이 적을 경우 파일 시스템을 검사하는 것이 좋습니다. 초당 수백 개가 있다면 디스크 I/O가 병목 현상이됩니다. –

+0

DB에 데이터를 저장하는 경우 (실제적으로 확장 성이 필요한 경우) 출력에 링크하기 전에 여전히'file_exists()'를 원할 것입니다. 하지만 일반적으로 파일 시스템 쿼리는 데이터베이스 쿼리보다 시간이 훨씬 적습니다. 파일 시스템 쿼리는 최소한의 오버 헤드로 낮은 수준의 운영 체제 호출이기 때문에 가장 단순한 데이터베이스 엔진조차도 아니며 확실히 TCP를 통한 MySQL이 아닙니다. – DaveRandom

답변

5

데이터베이스에 파일 이름이 완전히 저장되어 있어도 file_exists()을 사용하는 것이 좋습니다. 이렇게하면 DB가 파일 시스템과 동기화되지 않을 때 오류가 발생할 때 합리적인 오류가 발생합니다. 이런 종류의 오류 처리에는 여러 수준을 갖는 것이 좋습니다.

두 가지 경우 모두 file_exists()을 사용하므로 질문은 불필요합니다.

또한 코드를 마이크로 최적화하려는 유혹에 저항하는 것이 좋습니다.file_exists() 인 경우를 제외하고는 프로그램 속도에 큰 차이가 없습니다. 이 수준에서 실적을 미세 조정하려는 시도는 일반적으로 불필요합니다.

코드 성능이 걱정되면 XDebug와 같은 프로파일 링 도구를 사용하여 실제 성능 병목 현상이있는 위치를 알려줍니다. 당신은 약간을 가지지 만, 반복하지 않는 한, 당신이 여기서 본 코드에 포함되지 않을 것이라고 보장합니다.

0

, 짧은 실행에, 당신의 접근 방식이 빠르게 될 것입니다하지만 당신은 데이터베이스에서 이미지 이름을 가져 오는 경우 세션에 저장 :

나의 현재 file_exists 코드는 다음과 같습니다. 서버에 파일이 있는지 여부를 확인하는 대신 해당 페이지 액세스에 대해 매번 세션에서 값을 검색 할 수 있기 때문에 더 오래 실행하는 것이 더 빠릅니다.

0

답변이 많은 변수에 달려 있기 때문에 "어느 것이 더 낫지?"라는 질문과 "얼마나 좋아 졌습니까?"라는 질문에 모두 대답하는 간단한 테스트를 실행하는 것이 좋습니다.

컬 또는 자주 사용되는 자동화 된 HTTP 클라이언트)를 사용하여 파일 기반 코드를 1000 번 실행하고 클라이언트 측에서 경과 한 시간과 서버 측에서 소비 한 시간을 측정 한 다음 DB 기반 코드에서도 동일한 작업을 수행합니다.

값이 작은 경우 테스트를 여러 번 실행하거나 테스트 크기를 10000으로 늘리십시오.

1

필자는 file_exists가 훨씬 더 빠르다고 생각합니다. sql을 사용하는 동안 드라이버 등을 액세스해야하지만 file_exists는 시스템 작업입니다.

0

모든 이미지를 하나의 폴더에 저장하지 마십시오. 하위 폴더 사용 - 그렇지 않으면 입출력으로 인해 성능에 큰 타격을 입습니다. (10k + 파일이 눈에 띄게 될 때 100k + 파일이 큽니다)

이미지가 경량 웹 서버에서 제공되는지, 예를 들어, nginx는 아파치가 아니라, 아파치가 너무 많은 자원을 사용하기 때문에.

이제 질문이 있습니다. 일반적으로 파일 시스템이 빠릅니다. 그러나 파일 시스템은 다른 서버로 확장하기가 어렵습니다. 예를 들어 2 대의 웹 서버가있는 경우 어느 서버에서 아바타를 제공합니까? 모든 서버의 모든 파일을 복사하거나 공유 디스크를 사용하거나 분산 파일 시스템을 사용해야합니다. 따라서 성능뿐 아니라 수평 확장 성도 염두에 두어야합니다. 마지막으로 너무 디스크로 이동하기 때문에

또한, 당신은 더 많은 시간이 소요됩니다 데이터베이스를 조회, 내가 생각하는 파일에 대한 캐시와 같은 Varnish

0

를 사용할 수 있습니다.

디스크를 확인하면 한 번의 작업 만 수행되지만 데이터베이스의 경우 데이터베이스에 연결 한 다음 디스크 (db 파일이 저장된 위치)로 이동한다는 의미입니다. 그래서 파일 시스템이 빨라야합니다 (필자는 벤치마킹하지 않았습니다!).

관련 문제