programing

MongoDB에서 데이터를 중지하지 않고 삭제하는 방법은 무엇입니까?

showcode 2023. 6. 19. 21:49
반응형

MongoDB에서 데이터를 중지하지 않고 삭제하는 방법은 무엇입니까?

다음을 사용하여 MongoDB에서 더 많은 양의 데이터를 삭제할 때마다collection.remove()이것은 데이터베이스를 너무 느리게 만들어서 결국 우리의 웹 서버가 다운됩니다.제거 작업을 수행하면 컬렉션이 더 오랫동안 잠겨 있기 때문인 것 같습니다.

삭제할 모든 문서를 제공하는 쿼리가 있습니다.그러나 쿼리에 날짜/시간 필드가 포함되어 있지 않기 때문에 TTL 인덱스를 사용할 수 없습니다.

데이터를 제거할 수 있는 방법이 있습니까?nice가끔 자물쇠를 푸는 것?

대량 작업 사용

대량 작업이 여기에 도움이 될 수 있습니다.순서가 없는bulk.find(queryDoc).remove()기본적으로 의 버전입니다.db.collection.remove(queryDoc)많은 수의 작업에 최적화되어 있습니다.사용법은 매우 간단합니다.

var bulk = db.yourCollection.initializeUnorderedBulkOp()
bulk.find(yourQuery).remove()
bulk.execute()

자세한 내용은 MongoDB 문서에서 Bulk.find().remove()를 참조하십시오.

이 접근 방식의 아이디어는 제거 속도를 높이는 것이 아니라 부하를 줄이는 것입니다.테스트 결과, 부하가 절반으로 줄었고 시간은 a보다 약간 짧았습니다.db.collection.remove(query).

인덱스 생성

그러나 제거 작업을 수행해도 인스턴스가 동결되지 않습니다.5년 된 MacBook에서 1,200만 개의 문서를 제거하는 테스트를 해봤는데, 약간의 부하가 걸리는 동안 얼지 않고 10분 정도 걸렸습니다.그러나 쿼리할 때 사용한 필드는 색인화되어 있습니다.

이를 통해 수집 검사를 경험하고 있을 수 있다는 결론에 도달합니다.제 말이 맞다면 다음과 같습니다.쿼리에 인덱스에 포함되지 않았거나 인덱스 교차를 구성할 수 없는 필드 또는 필드 조합이 포함되어 있습니다.이렇게 하면 문제의 mongod는 데이터베이스의 각 문서에 대한 필드를 디스크에서 찾고, 액세스하고, 읽습니다.

따라서 제거 작업을 수행하기 전에 쿼리의 각 필드가 포함된 인덱스를 백그라운드로 작성하는 것이 유용할 수 있습니다.

db.collection.createIndex(
  {firstFieldYouQueryBy:1,...,NthFieldYouQueryBy:1},
  {background:true}
)

이 작업은 백그라운드에서 수행되지만 셸이 차단됩니다.시간이 좀 걸릴 수 있습니다.두 번째 셸을 열고 다음을 사용하여 상태를 확인할 수 있습니다.

db.currentOp()

(조금 검색해야 합니다.)

인덱스가 생성될 때(사용자가 사용하여 확인할 수 있음db.collection.getIndices()더더 빨라야 합니다.), 제거 작업이 더 효율적이어야 합니다.대량 제거가 완료된 후 별도로 필요하지 않은 경우 인덱스를 삭제할 수 있습니다.

인덱스를 사용하면 수집 검색을 방지할 수 있으므로 제거 속도가 상당히 빨라집니다.

두 가지 접근 방식의 결합

인덱스를 먼저 생성하고 인덱스가 준비된 후 대량 명령을 실행하는 것이 합리적이라는 것이 분명해야 합니다.

언급URL : https://stackoverflow.com/questions/33123008/how-to-delete-data-from-mongodb-without-slowing-it-down-to-a-halt

반응형