2011-04-20 3 views
0

고유 한 ID가 약 110 만 개가 있는데, 해당 데이터베이스의 해당 레코드가없는 레코드를 결정해야합니다. ID 세트는 데이터베이스에서도 제공되지만 동일한 것은 아닙니다. PHP와 MySQL을 사용하고 있으며 충분한 메모리가 있습니다 - PHP는 15GB RAM이있는 서버에서 실행되며 MySQL은 7.5GB RAM이있는 자체 서버에서 실행됩니다.PHP와 대용량 MySQL 데이터 세트 비교

일반적으로 모든 ID를 하나의 쿼리에로드 한 다음 SELECT 쿼리의 IN 절과 함께 사용하여 한 번에 비교할 수 있습니다.

지금까지 나의 시도는 참을 수 없을만큼 오랜 시간이 걸리거나 CPU를 100 %까지 끌어 올리는 스크립트를 만들어 냈습니다.

이렇게 큰 데이터 세트를로드하고 비교하는 가장 좋은 방법은 무엇입니까?

+5

not in 절 대신 왼쪽 결합을 사용하십시오. –

+2

당신은 메모리에 데이터 셋을로드 할 수 있도록 MySQL 인스턴스를 구성해야합니다. (1.1 mil은 7.5GB 램에 쉽게 들어 맞아야합니다.) 닉이 말했던 것을 수행하고, 대신에 왼쪽 조인을 사용하십시오. 쿼리가 매우 빠릅니다. –

답변

3

첫 번째 데이터베이스의 ID를 파일로 생성 한 다음 두 번째 데이터베이스의 임시 테이블에 다시로드하고 해당 임시 테이블과 두 번째 데이터베이스 테이블을 조인하여 해당 ID를 식별합니다. 일치하는 레코드가 없습니다. 해당 목록을 생성하면 임시 테이블을 삭제할 수 있습니다.

그런 식으로 PHP 자체에서 많은 양의 데이터로 작업하지 않으므로 메모리 문제가 없어야합니다.

1

테이블이 동일한 DB 서버에 있지 않고 서버가 처리 할 수 ​​있기 때문에 테이블을 조인 할 수 없다고 가정하면 하나의 DB에있는 모든 ID로 배열을 채운 다음 other를 사용하고 in_array를 사용하여 각 배열이 배열에 있는지 확인합니다.

BTW - this에 따르면 in_array를보다 효율적으로 만들 수 있습니다.