안녕하세요.
현재 500만건 정도의 데이터에서 무작위로 1건씩 추출하여 데이터를 점검하는 프로젝트를 진행하고 있습니다.
점검 테이블은 flag(대기, 진행중, 완료) 3가지 데이터로 구성되어 있습니다.
문제는 점검 thread가 여러개라는 겁니다.
점검 데이터를 가져올 때 아래와 같이 2개의 쿼리를 날리면 중복건이 발생합니다. (1초 사이에도 100개의 thread 가 발생하기 때문)
1) "SELECT * FROM [TABLE] WHERE flag = '대기' LIMIT 1"
2) "UPDATE [TABLE] SET flag = '진행중' WHERE seq = '키'
그래서 해결방안을 찾은게 아래와 같이 update -> select 를 방법입니다.
1) "UPDATE [TABLE] SET flag = '진행중', seq = (SELECT @update_id := seq) WHERE flag = '대기' LIMIT 1"
2) "SELECT * FROM [TABLE] WHERE seq = (SELECT @update_id)"
여기서 문제가 해결될 걸로 예상되었으나, 점검수가 30만건을 넘어가면서 처음에는 빨랐던 1번 UPDATE 쿼리가 엄청나게 느려졌다는 겁니다.
이 부분에 대해서 해결 방안이 있을지 조언 부탁드립니다.
구조를 변경하는 방법도 고려하고 있으니 다양한 의견들 주시면 좋겠습니다.
감사합니다.
|