programing

UPDATE를 사용하여 장시간 실행 중인 SELECT가 데이터베이스를 잠급니다.

i4 2023. 7. 30. 17:05
반응형

UPDATE를 사용하여 장시간 실행 중인 SELECT가 데이터베이스를 잠급니다.

실행 시간이 오래 걸리는 선택 문이 있습니다(약 5분).이 때문에 저는 매 시간마다 쿼리를 실행하고 결과를 메타데이터 테이블에 저장합니다.다음은 질문입니다.

UPDATE `metadata` SET `value` = (select count(`id`) from `logs`) WHERE `key` = 'logs'

하지만 이것이 제가 겪고 있는 문제입니다(그리고 제가 틀렸다면 고쳐주세요).선택 문은 데이터베이스를 잠그지 않지만 업데이트 문은 잠급니다.이제 업데이트 쿼리 내에서 선택 쿼리를 이렇게 오래 실행하면 DB가 약 5분 동안 잠깁니다.

select 문을 실행하고 변수에 저장한 후 업데이트 쿼리를 실행하는 더 좋은 방법이 있습니까?이렇게 하면 DB가 잠기지 않습니다.

또한 저는 더러운 데이터에는 관심이 없습니다.

데이터베이스에는 3억 개 이상의 행이 있으며 지속적으로 추가되는 데이터가 있습니다.

mariadb 1.1부터 시작하여 변수가 설정되지 않은 상태로 카운트를 가져오는 문과 이를 저장하는 문 사이에 서버의 연결이 끊길 가능성을 피하기 위해 여러 개의 문을 블록에 넣어 단일 요청에서 실행할 수 있습니다.

begin not atomic
    declare `logs_count` int;
    select count(*) into `logs_count` from `logs`;
    update `metadata` set `value`=`logs_count` where `key`='logs';
end

만지작거리다

쿼리가 실행되기 전에 이 설정을 설정하는 것이 효과적이고 훨씬 빠르게 실행된다는 것을 알게 되었습니다.이렇게 하면 쿼리를 실행할 때 DB가 잠기지 않습니다.그런 다음 잠금이 완료된 후 잠금을 활성화합니다. (여기서 잘못된 부분이 있으면 수정해 주십시오.)

BEGIN
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
UPDATE `metadata` SET `value` = (select count(`id`) from `logs`) WHERE `key` = 'logs';
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
END

언급URL : https://stackoverflow.com/questions/70948215/long-running-select-with-update-locks-database

반응형