source

MariaDB/MySQL에서 잠금 없이 삭제?(InnoDB)

nicesource 2022. 10. 15. 08:35
반응형

MariaDB/MySQL에서 잠금 없이 삭제?(InnoDB)

로는, 가가아 , as , as 。DELETE FROM ... WHERE가 테이블에 잠금을 발행합니다.

현재 MariaDB에는 1TB 이상의 크기의 거대한 InnoDB 테이블이 있으며, 전체 데이터베이스가 삭제할 행을 검색할 때까지 잠그는 것은 옵션이 아닙니다.

삭제 중에 특정 기준에 일치하는 행을 잠그지 않고 삭제할 수 있는 방법이 있습니까?

이 경우의 자세한 내용은 다음과 같습니다.

  • 서버는 Debian Stretch 저장소에서 MariaDB 10.1.22-3을 실행하고 있습니다.
  • 과 32GB의 RAM이 .innodb_buffer_pool_size = 20G
  • 이상이며 1TB가 .INSERT §SELECT ()
  • 데이터베이스 전체에는 2개의 테이블만 포함됩니다.
    • 데이터(기본적으로 '1'과 같은 에 표 1개data (BIGINT id, LONGTEXT data)서 (어디서)dataJSON을 사용하다.이것이 완벽한 관계형 데이터베이스 모델은 아니지만 JSON은 서드파티에 의해 제공되며 매우 복잡하며 언제든지 예고 없이 서드파티에 의한 구조 변경을 포함할 수 있습니다.)
    • 어떤 의 '을 만족시킬 수 있는 입니다.SELECT (말하면, 은 s.와 같은 수 .data_index (BIGINT id, INT userId, INT itemId, BIGINT timestamp) 이렇게 쓸 수 SELECT하여 실제합니다.userId " itemId " ididtimtim。 ( 단위)입니다 (unix 타 ( ix밀밀밀밀 밀밀밀
  • 말씀드렸다시피, 데이터는 한정된 시간 동안만 저장되어야 합니다.따라서 기본적으로 하루에 한 번 실행되는 cronjob을 생성하여 7일보다 오래된 행을 삭제합니다.

이 작업을 수행하기 위해 다음과 같은 간단한 질문을 자연스럽게 떠올리게 됩니다.

DELETE `data`, `data_index`
FROM `data_index`
LEFT JOIN `data` ON `data`.`id` = `data_index`.`id`
WHERE `timestamp` > (NOW() * 1000) - (7 * 24 * 60 * 60 * 1000)

하지만 이것은 아마 꽤 오랫동안 테이블을 잠글 것이다.테이블을 잠그지 않고 동일한 작업을 수행함으로써 데이터베이스를 다른 작업에 사용할 수 있도록 하려면 어떻게 해야 합니까?SELECT ★★★★★★★★★★★★★★★★★」INSERT의할할 수???

아니요, 검사한 행을 잠그지 않고는 삭제할 수 없습니다.

, 할 수 .timestamp★★★★★★★★★★★★★★★★★★

또한 새 행이 DELETE에 영향을 미치지 않도록 테이블 끝에 삽입할 수 있는 행에 대한 간격 잠금이 생성됩니다.

InnoDB에서는 DELETE에 의해 작성된 것과 같은 일반적인 쓰기 잠금이 읽기를 차단하지 않습니다.동시 트랜잭션은 삭제 중인 행을 포함하여 계속 행을 읽을 수 있습니다.

일반적인 쓰기 잠금으로는 테이블 전체를 잠글 수 없습니다.ALTER TABLE이나 DROP TABLE에서 요구하는 다른 테이블 잠금 장치를 방지하는 의도적인 잠금 장치로 테이블을 잠급니다.즉, 테이블에 읽기 또는 쓰기가 진행 중인 동안에는 테이블을 ALTER/DROP할 수 없습니다.

제 프레젠테이션이 마음에 드실 겁니다.InnoDB 잠금에 대해 스틱 피규어로 설명합니다.

제가 틀렸을 수도 있지만, https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html에서는 테이블 잠금이 아니라 행 잠금이 된다고 읽었습니다.

어쨌든 시도해 보세요.

삭제...송신원...위치...제한 x

필요한 횟수만큼 실행할 수 있습니다.실행 사이에 다른 쿼리를 입력하여 영향을 최소화할 수 있습니다.물론 부하가 적은 시간대에 이 작업을 수행합니다.

(NOW() * 1000) - (7 * 24 * 60 * 60 * 1000)유효한 시간이 아닌 것 같습니다.그렇다.20170519568613000혼합된 것 처럼 보입니다.DATETIME그리고 몇 밀리초 정도 걸립니다.아마도 당신은 원했을 것이다.UNIX_TIMESTAMP() * 1000 - (7 * 24 * 60 * 60 * 1000) = 1494742589000.

몇 개의 행을 삭제할 예정입니까?큰 숫자일 경우 분할 또는 청크 삭제를 고려합니다.

언급URL : https://stackoverflow.com/questions/44091163/delete-without-lock-in-mariadb-mysqlinnodb

반응형