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
'programing' 카테고리의 다른 글
문자열에서 하위 문자열의 n번째 발생 찾기 (0) | 2023.06.19 |
---|---|
OR 기준이 있는 SUMIF (0) | 2023.06.19 |
아이폰 웹 애플리케이션에서 방향을 세로 모드로 잠그려면 어떻게 해야 합니까? (0) | 2023.06.19 |
'commit date'를 표시하도록 'git log'를 구성하는 방법 (0) | 2023.06.19 |
사용자가 Vue 및 Vuex에서 첫 번째 경로에서 두 번째 경로 및 두 번째 경로에서 첫 번째 경로로 이동할 때 첫 번째 경로에서 기능을 실행하려고 합니다. (0) | 2023.06.19 |