programing

거대한 MySQL innoDB 테이블에서 레코드 삭제

goodsources 2023. 2. 2. 21:14
반응형

거대한 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

반응형