"대기열"이라는 큰 테이블이 있습니다. 현재 1,200 만 레코드가 있습니다.MySQL 성능 - 큰 테이블에서 선택 및 삭제
CREATE TABLE `queue` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(64) DEFAULT NULL,
`action` varchar(32) DEFAULT NULL,
`target` varchar(64) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`state` int(11) DEFAULT '0',
`timestamp` int(11) DEFAULT '0',
`errors` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_unique` (`userid`,`action`,`target`),
KEY `idx_userid` (`userid`),
KEY `idx_state` (`state`)
) ENGINE=InnoDB;
다중 PHP 작업자 (150)는 동시에,이 테이블을 사용한다.
레코드를 선택하고 선택한 데이터를 사용하여 네트워크 요청을 수행 한 다음 레코드를 삭제합니다.
선택 및 삭제 쿼리에서 실행 시간이 혼합되었습니다. 삭제 명령이 테이블을 잠그고 있습니까?
이 시나리오에 가장 적합한 방법은 무엇입니까?
는-
는
- 는
SELECT 기록 + 네트워크 요청 + 기록을 삭제
는 SELECT 기록 + 네트워크 요청 + 수시로 크론을 사용하여 완료 + Delete를 완료 기록과 같은 MARK 레코드 (나는 심지어 원하지 않는 큰 테이블).
참고 : 큐는 매분마다 새 레코드를 가져 오지만 INSERT 쿼리는 여기에서 문제가되지 않습니다.
도움을 주시면 감사하겠습니다.
데이터베이스를 대기열로 사용하고 여러 클라이언트에서 작업하는 경우 잠금 경합에 부딪치게됩니다. 데이터베이스를 대기열로 사용하려고하면 모든 사람이이 작업에 어려움을 겪습니다. 대신 데이터베이스가 아닌 실제 메시지 큐 소프트웨어를 사용해야합니다. ActiveMQ 또는 Beanstalkd 또는 RabbitMQ 또는 Resque와 같은 것입니다. –
특히 쿼리 성능에 관한 부분을 읽으면 도움이 될 것입니다. http://meta.stackoverflow.com/a/271056/ 그런 다음 질문을 편집하여 세부 정보를 제공 할 수 있습니다. –