2010-05-30 2 views
0

자주 업데이트되는 MySQL 테이블이 있습니다. 본질적으로, 나는 한 번에 여러 개의 PHP 스크립트로 500 개의 행을 잡으려고 노력하고 있으며, PHP 스크립트가 같은 행을 가져 오는 것을 원하지 않습니다. 수천 개의 행이있는 서버로드로 인해 ORDER BY RAND()를 사용하지 마십시오.동일한 행을 신속하게 선택 및 업데이트하려고 시도합니다.

그래서 각 스크립트가 모든 행의 상태를 "1"로 설정 했으므로 다시 잡히지 않을 것입니다. 그래서, 나는 status = 0 (나는 오름차순으로 SELECT 명령을 사용함)을 500 행을 가져오고, 그 다음 정확히 500 행을 상태 "1"로 설정하여 다른 스크립트가 그 행을 가져 가지 못하도록하고 싶습니다.

테이블이 항상 업데이트되므로 오름차순으로 500 개의 행을 선택한 다음 오름차순 행으로 500 개의 행을 업데이트 할 수 없습니다. 왜냐하면 스크립트를 시작하고 SELECT를 수행 할 때까지 더 많은 행을 추가 될 수 있습니다.

따라서 500 행을 선택하고 내가 선택한 행을 어떻게 든 기억하고 업데이트해야합니다.

내가 설명했던 것처럼 신속하게 SELECT 및 UPDATE를 수행하는 방법은 무엇입니까?

답변

0

각 스크립트에 대해 고유 한 ID를 생성합니다 (이러한 목적으로는 일반적으로 임의의 정수 만 사용 가능).

각 프로세스에서 UPDATE table SET status = <my random id> WHERE status = 0 LIMIT 500 쿼리를 실행하십시오.

그런 다음 각 프로세스에서 실제로 행을 가져 오려면 SELECT ... FROM table WHERE status = <my random id>을 실행하십시오.

기본적으로 행을 현재 스크립트 에 "잠근"후에 성공적으로 잠근 행을 검색합니다.

+0

선생님, 제가 생각하지 못한 천재적인 생각입니다. 고맙습니다. – walden

+0

안녕하세요. 한 가지 간단한 질문 : 같은 스크립트에서 cron을 동시에 실행하고 동일한 순서로 500 개의 행을 가져 와서 업데이트하면 동일한 행 중 일부가 한 번 이상 업데이트 될 가능성이 있습니다 ? 나는 그것이 유일 할 필요가있다. – walden

+0

'UPDATE'의 메 커닉은이 경우 행당 여러 개의 업데이트를 방지하지만 재확인해야 할 수도 있습니다. – Amber

관련 문제