거대한 MySQL innoDB 테이블에서 레코드 삭제
이 질문은 백 번을 물어봤지만 안타깝게도 도움이 되지 않았다.대부분이 오랜 세월이 흘렀기 때문에 또 다른 질문도 정당화될 것이다.
테이블이 두 개 있는데records
와 함께+140kk rows/+24GB
그리고.extra
와 함께+89kk rows/+70GB
.
모든extra
행과 외부 키 관계가 있다records
인덱스는 2개의 테이블 사이에 올바르게 설정되어 있습니다.에서의 삭제처records
삭제 내용을 관련에 캐스케이드하다extra
배를 젓다.
제작 중에 오래된 기록을 삭제해야 합니다.입니다.DELETE FROM records WHERE WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) ORDER BY id LIMIT 1000;
끝도 없이 (20분 후에 죽였어요)init
)에 대해서도 같은 처리를 합니다.SELECT
단 몇 밀리초 만에 완료됩니다.
그 이후로는SELECT
그렇게 빠른가요? 제가 한번 해봤는데id IN (SELECT id subquery^)
하지만 안타깝게도 아무것도 변하지 않았어요 그래서 15분 후에 죽였어요
싱글 레코드의 삭제는 고속이기 때문에, 다음과 같은 작업을 실시하게 되었습니다.
for i in `seq 1 100000`; do
mysql database -e "SELECT id FROM records WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) ORDER BY id LIMIT 1000;" | sed 's;/|;;g' | awk '{if(NR>1)print "DELETE FROM records WHERE id = ",$1,";" }' | mysql database;
now=$(date +"%Y/%m/%d %T")
echo "[ $now ] $i.000"
done
처음에는 초당 1,000개의 레코드를 처리할 수 있지만 몇 번의 루프가 발생하면 10-20초당 1,000개까지 내려갑니다.10만 행을 소거해야 하기 때문에 소거하는 레코드의 경과시간과 거의 같은 시간대에 완료되는 데 거의 한 달이 소요됩니다.따라서 소거가 필요한 데이터베이스가 여러 개 있기 때문에 이 작업은 종료되지 않습니다.
데이터베이스가 SSD에 저장되어 있습니다.Crucial_CT500MX200SSD1
또, 소프트웨어는MariaDB 10.1
와 함께InnoDB
엔진입니다.gengine을 클릭합니다. innodb_flush_log_at_trx_commit
로 설정되어 있다.0
불필요한 디스크 사용을 방지합니다.
에 따르면atop
병목현상은 디스크이며 CPU는 거의 sleeve 상태이며 메모리 대부분은 시스템 캐시에 있습니다.
구조 덤프: https://gist.github.com/Slind14/0da34e09dba91cf411db2ead5ad666ef
http://mysql.rjweb.org/doc.php/deletebig 를 참조해 주세요.
큰 테이블에서 많은 행을 효율적으로 삭제하는 다양한 방법에 대해 설명합니다.
가장 효과적일 수 있는 것은 다음 표에 따라 이동하는 것입니다.PRIMARY KEY
(이러한?)를 지정해, 그 청크의 어느 행이 기준에 일치하는지를 삭제합니다.
이 방법이 효율적인 이유는 예를 들어, 한 번에 100개의 행을 확인하고 그 행과 함께 작동한 후 다음 100개의 행으로 이동하기 때문입니다.이와는 대조적으로LIMIT
그리고 무제한WHERE
구에서는 같은 행을 여러 번 스캔해야 할 수 있습니다.
아까 말씀하셨는데JOIN
비용이 얼마나 드느냐에 따라 100이 적절한 제한이 될 수 있습니다.이 경우,JOIN
너무 부담스럽지 않습니다.1000달러
작업이 될 , '사용할 수 없다'의 사용을 .PARTITIONing
해서DROP PARTITION
그 행위를 '조종'하는 데 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/42307213/deleting-records-from-huge-mysql-innodb-table
'programing' 카테고리의 다른 글
단일 쿼리의 여러 선택 문 (0) | 2023.02.02 |
---|---|
MariaDB: 계산된 열을 사용한 계산 (0) | 2023.02.02 |
JavaScript에서 IE 버전(v9 이전)을 검출하다 (0) | 2023.02.02 |
최소/최대와 주문 기준 및 제한 (0) | 2023.02.02 |
Array List - 인덱스가 존재하는지 확인하려면 어떻게 해야 합니까? (0) | 2023.02.02 |