약 500,000 개의 행을 포함하는 (현재 InnoDB) 테이블이 있습니다. 이것은 실행할 작업 대기열을 나타냅니다. 그것은 MySQL 데이터베이스에 저장됩니다.MySQL 삭제에 대한 교착 상태
연속적으로, 적어도 초당 1 회이지만 때로는 더 자주, 우리는 데이터를 선택하고이어서 일부 행을 업데이트합니다. 하루에 한 번 테이블에서 오래된 행을 정리합니다.
테이블에 교착 상태가 발생하기 시작하여 작업 처리가 중단되었습니다. 이러한 교착 상태는 야간 치뤄가는 동안 발생합니다. DELETE, SELECT 및 UPDATE의 조합은 본질적으로 아무런 생산성도 발생할 수 없다는 것을 의미했습니다. 불행히도 SHOW ENGINE INNODB STATUS 출력은 없습니다.
이 문제를 해결하기위한 최선의 방법을 알고 싶습니다. 우리 코드는 교착 상태를 감지하고 쿼리를 재발행합니다. 또한 우리는 이전에 일치하는 모든 행을 한 번에 삭제하는 것이 많은 활동을 보인 데이터베이스 테이블에 너무 부담이된다는 것을 발견 했으므로 한 번에 10,000 개의 행을 삭제하고 모든 필요한 행이 완료 될 때까지 계속 재발행합니다 가지 치기.
나는 다음과 같은 옵션을 참조하고있는 다른 옵션에 가장 적합한, 또는 제안 사항 의견을 싶습니다
- 한 번 우리의 건의 DELETE에
- 사용 지수 백 오프에서 적은 수의 행을 삭제 내가하지만, 이것은 우리의 특정 작업 부하가 주어질 때 도움이되지 않을 것이라는 점을 염려합니다.
- 잠금 테이블 MySQL documentation. 아마도 삭제 기간 동안 SELECT 문과 UPDATE 문을 차단할 수 있습니다.
- MyISAM 테이블 유형으로 전환하십시오. 처음에이 테이블에서 트랜잭션을 사용했기 때문에 InnoDB를 방문했습니다. 더 이상 그렇지 않습니다. 나는 그것이 실행 가능한 해결책인지를 알기 위해 세부 사항에 익숙하지 않다.
- 아마도 UPDATE LOW_PRIORITY를 사용하십시오. DELETE가 SELECT에 영향을 미치지 않고 단지 UPDATE에만 영향을 미칠 수 있으며 이것이 충분할 수 있습니다.
내가 만난 모든 교착 상태는 커밋되지 않은 트랜잭션 때문이었습니다. 트랜잭션을 올바르게 실행하고 있는지 확인하십시오 (자동 커밋 또는 자동 커밋 해제 및 실제로 커밋/롤백 처리). – localshred
확실히 좋은 점; 이것은 대부분의 경우이지만 우리는 실제로이 테이블에서 트랜잭션을 수행하지 않습니다. 우리는 익숙했지만 더 이상하지 않습니다. – ChrisInEdmonton