반응형
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
반응형
'programing' 카테고리의 다른 글
해시 테이블을 키-값 쌍으로 열거하거나 키 값 집합으로 해시 테이블을 필터링하는 방법 (0) | 2023.08.04 |
---|---|
HTML에서 구성 요소의 정적 변수를 각도 2에서 바인딩하는 방법은 무엇입니까? (0) | 2023.08.04 |
W3C DOM을 통해 HTML 문서 전체를 대체하기 위한 다른 옵션은 무엇입니까? (0) | 2023.07.30 |
MariaDB 도커 시작 실패 (0) | 2023.07.30 |
스웨거 주석이 있는 스웨거에서 설명과 예제를 설정하려면 어떻게 해야 합니까? (0) | 2023.07.30 |