2010-02-01 5 views
3

안녕하세요 2 mysql 테이블이 있고 둘 다 업데이트해야합니다.Mysql PHP 스크립트는 리팩터링을 필요로합니다.

companies 
unique_code 

회사는 1 백만 레코드를 보유하고 있으며 각각 고유 한 코드를 필요로합니다. 문제는 PHP 스크립트를 모든 회사에서 가져 오는 것입니다. foreach 루프는 unique_code 테이블에서 유니 코드 코드를 가져 와서 업데이트하고 unique_code 테이블을 업데이트하여 사용 된 코드에 플래그를 지정합니다.

PHP 코드는 오래 동안 멈추고 최대 실행 제한에 도달합니다. 나는 정말로 붙어있어서이 회사들에게 고유 한 코드를 필요로합니다. 다른 접근 방식을 생각할 수 있습니까?

코드 예제를 잘랐습니다.

 foreach ($aCompanies as $companies){ 

    $query="SELECT * FROM unique_code WHERE used = 0" 

    foreach(unique_code as code){ 
     // UPdate companies table 
     $query = "UPDATE companies SET id = $code"; 
     // Flag code used 
     $query = "UPDATE unique_codes WHERE code = $code"; 
    } 
} 

시간을내어 건배.

전체 코드 :

$query1 = "SELECT code FROM unique_codes WHERE used = 0\n"; 
$aUniqueCode = $oDbh->getAll($query1); 

$query2 = "SELECT id FROM companies"; 
$aCompanies = $oDbh->getAll($query2); 

foreach ($aCompanies as $companies){ 

    $query = "SELECT code FROM unique_codes WHERE used = '0' LIMIT 1"; 
    $oCode = $oDbh->getRow($query); 

    $query3.= "UPDATE companies SET code = $oCode->code WHERE id = $companies->id\n"; 

    $query4 = "UPDATE unique_codes SET used = '1' WHERE code = $oCode->code\n"; 
    $oDbh->query($query4);  
} 
print print_r($query3).';'; 
exit; 

내가하고있는 일은 모든 SQL을 파일로 내보내는 회사를 업데이트하지 않기 때문에 나중에 가져올 수 있습니다.

+0

사용중인 MySQL 버전은 무엇입니까? 당신은 이것을 위해 방아쇠를 사용하는 것을 고려 했습니까? –

+0

MySql 버전 4, 나는 기술적 인 방아쇠를 알지 못합니다. –

+0

더 완벽한 코드 예제를 제공 할 수 있습니까? 어디에서'$ companies'와'UPDATE unique_codes WHERE code = $ code'를 사용하면 아무 것도하지 않습니다. –

답변

0

특정 입력란에서 색인 생성을 사용 설정 했습니까? 방금 (테이블에 새 기본 키를 추가하려는 경우

$query="SELECT field1, field2, field3, etc FROM unique_code WHERE used = 0" 
3

대신

$query="SELECT * FROM unique_code WHERE used = 0" 

: 또한 당신이 필요 오히려 모든 것보다 쿼리의 필드 (*)를 선택해야합니다 그러므로 한 번 프로세스) PHP에서하지 마십시오. MySQL을 직접 사용하고 alter table을 사용하여 작업을 완료하십시오. MySQL은 직접적으로 더 빠르며 PHP와 같은 긴 프로세스에서 타이밍 문제가 발생하지 않습니다.

다른 작업을 수행하려는 경우 테이블 스키마를 좀 더 올려 놓고 싶을 수 있습니다. 목표가 옳다는 것이 완전히 분명하지 않습니다.

+0

건배 응원에 대한 문제는 코드가 무작위이기 때문에 모두 9 ~ 8 자로 시작하므로 간단한 자동 증가 만 수행 할 수 없습니다. –

+0

안녕하세요, 올바른 기본 키는 회사 = id 및 unique_codes = 코드에 추가됩니다. –

+0

이 시점에서 제가 이해하는지 보겠습니다. 각 코드가 적어도 하나의 회사에 할당되어 있으므로 코드 목록에서 1 개의 코드를 가져 와서 회사에 할당하려고합니다. 맞나요? 생성 한 임의 코드가 이미 의미있는 것입니까? (필요한 경우 다시 생성 할 수 있습니까?) – acrosman

0

유니큐 (uniuque) 코드가 기본 키이고, 기본 키가 아닌 경우 WHERE 절에 사용 된 필드를 인덱싱 할 수 있는지 확인하십시오. T

데이터베이스에 병목 현상이 있음을 어떻게 알 수 있습니까? 프로파일 링을 위해 Xdebug를 사용할 수 있으므로 병목이 실제로 어디 있는지 확인할 수 있습니다.

Memchace를 사용하면 가장 많이 사용 된 개체를 메모리에 저장하고 읽을 때 데이터베이스 히트를 줄일 수 있습니다 (SELECT).

관련 문제