database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 31245 게시물 읽기
No. 31245
mysql 무작위 업데이트(LIMIT 1)에 대한 성능 조언 구합니다.
작성자
민민아빠
작성일
2019-06-24 12:11
조회수
2,047
안녕하세요.
 
현재 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 쿼리가 엄청나게 느려졌다는 겁니다.
 
이 부분에 대해서 해결 방안이 있을지 조언 부탁드립니다.
 
 
 
구조를 변경하는 방법도 고려하고 있으니 다양한 의견들 주시면 좋겠습니다.
 
감사합니다.
 
이 글에 대한 댓글이 총 2건 있습니다.

아래 쿼리로 변경하고 진행 해보세요 

 

여기서 seq 는 인덱스가 있어야 됩니다.

 

UPDATE t1 join (SELECT @update_id := seq ,seq from  t1 WHERE flag = '대기' LIMIT 1) s on s.seq=t1.seq  SET t1.flag = '진행중'

 

SELECT * FROM [TABLE] WHERE seq = (SELECT @update_id)

정송화(qidan3500)님이 2019-06-27 11:28에 작성한 댓글입니다.
이 댓글은 2019-06-27 11:29에 마지막으로 수정되었습니다.

답변 감사합니다. 현재 커버링 인덱스로 select 해서 어느 정도 해결한 상황인데 알려주신 방법으로도 확인해 보겠습니다.

민민아빠님이 2019-06-28 10:15에 작성한 댓글입니다.
이 댓글은 2019-06-28 10:17에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
31249다른 DB의 컬럼을 참조하는게 타당한 사용 방법인가요? [2]
조동건
2019-07-05
2051
31247mysql 구원해주실분 ... [2]
왕초보
2019-06-27
2237
31246mysql - wpf 오류
흑흑
2019-06-25
7928
31245mysql 무작위 업데이트(LIMIT 1)에 대한 성능 조언 구합니다. [2]
민민아빠
2019-06-24
2047
31244mysql to sqlite
초보
2019-06-19
1902
31243mysql 인덱스 리빌드(재정렬) 관련 질문
타모으
2019-06-13
2198
31242mysql에서 숫자만 입력되었는지 체크할수있나요? [2]
이기자
2019-06-11
2194
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다