전화로 확인할 때 확인MongoDB 컬렉션의 인덱스?
?ensureIndex
단일 레코드를 삽입하기 전, 단일 레코드를 삽입한 후 또는 호출하기 전find()
?
제 의견이 조금 오해를 받은 것 같으니, 분명히 말씀드리겠습니다.처음 find()를 호출하기 전에 어느 시점에서 호출되기만 하면 언제 호출하든 상관없습니다.즉, 인덱스를 사용하기 전에 인덱스가 있는 한 인덱스를 만들 때는 중요하지 않습니다.
제가 많이 본 일반적인 패턴은 코딩입니다.ensureIndex
동시에 (그리고 같은 장소에서)find()
러불러.ensureIndex
인덱스가 있는지 확인하고 없으면 만듭니다.를 찾기 에 확실한 할 여지 없이 의 오버헤드 작지만 이 작업을 하지 않는 () ▁there▁before(▁(index다매좋니▁some▁is)습)▁overhead▁ensure것▁calling▁ever이▁to▁findal않가(▁call는▁this▁it▁to▁do하▁smallbeit▁veryable▁in'지s이▁undoubted
전화합니다ensureIndex
배포를 단순화하고 DB와 코드베이스를 별도로 관리할 필요가 없도록 코드를 작성합니다.구축 용이성의 균형을 유지하여 후속 통화의 중복성을 균형 있게 조정합니다.색인(나의 경우)
전화로 확인하는 것이 좋습니다.응용프로그램이 시작될 때 한 번 인덱싱합니다.
상관없지만 한 번만 해주시면 됩니다.빈 컬렉션에 대량의 데이터를 일괄적으로 삽입하려면 삽입 후에 인덱스를 만드는 것이 가장 좋지만 그렇지 않으면 문제가 되지 않습니다.
이 작업은 한 번만 수행하면 됩니다.예:
db.table.insert({foo: 'bar'});
var foo = db.table.findOne({foo: 'bar'}); // => delivered from FS, not RAM
db.table.ensureIndex({foo: 1});
var foo = db.table.findOne({foo: 'bar'}); // => delivered from RAM, not FS
db.table.insert({foo: 'foo'});
var foo = db.table.findOne({foo: 'foo'}); // => delivered from RAM, not FS
미리 인덱스를 추가하는 경우 모든 삽입/업데이트/삭제 호출은 각 인덱스도 수정해야 합니다.따라서 최적화의 관점에서는 쿼리를 실행하기 전에 가능한 한 오래 미루는 것이 좋습니다.그러나 기능적인 관점에서는 문제가 되지 않습니다.
나의 는보통나를 .ensureIndex()
MongoDB와의 통신을 관리하는 내 응용 프로그램 부분에 대한 init 블록 내의 호출.그리고 포장도 해드릴게요.ensureIndex()
프로그램이 하려면 내가 있는 를 확인하기 . 이 esured 플애리케알존있컬재대렉는션에한의합보검사니다장야이로방으법해존재이호출내의이션이작내고동가면려하▁calls보▁within▁the애장▁ensureation▁way;▁this▁to,▁a▁applic플ion,▁i▁for▁for▁a▁of▁the▁collect▁exist로▁function▁check▁existence방▁must▁know으이법;합다니리.인덱스() 호출은 응용 프로그램이 특정 MongoDB 인스턴스에 대해 처음 실행될 때 한 번만 호출됩니다.
나는 다른 곳에서 확실하게 하는 것에 반대하는 의견을 읽었습니다.다른 개발자가 실수로 인덱스를 변경하고 DB(인덱스)를 변경할 수 있으므로 인덱스()는 응용프로그램 코드로 호출하지만 컬렉션이 있는지 확인하기 위해 이를 래핑하면 이를 방지할 수 있습니다.
Java MongoDB 드라이버 예:
DB db = mongo.getDB("databaseName");
Set<String> existingCollectionNames = db.getCollectionNames();
// init collections; ensureIndexes only if creating collection
// (let application set up the db if it's not already)
DBCollection coll = db.getCollection("collectionName");
if (!existingCollectionNames.contains("collectionName")) {
// ensure indexes...
coll.ensureIndex(BasicDBObjectBuilder.start().add("date", 1).get());
// ...
}
수백만 개의 레코드가 있는 컬렉션이 있고 자동 인덱싱이 해제된 상태에서 여러 복합 인덱스를 작성하는 경우 반드시 호출해야 합니다.처음 쿼리를 찾기 훨씬 전에 인덱스(), 즉 확인 후 동기화할 수 있습니다.인덱스 메서드가 반환됩니다.
인덱스가 작성되는 모드(전경 대 배경)는 복잡성을 더합니다.전경 모드는 인덱스를 작성하는 동안 전체 DB를 잠그는 반면 배경 모드에서는 DB를 쿼리할 수 있습니다.그러나 인덱스 작성의 백그라운드 모드는 시간이 더 걸립니다.
따라서 인덱스가 성공적으로 작성되었는지 확인해야 합니다.db.currentOp()를 사용하여 의 진행률을 확인할 수 있습니다.인덱스를 만드는 동안 인덱스()를 만듭니다.
언급URL : https://stackoverflow.com/questions/7000777/when-to-call-ensureindex-on-a-mongodb-collection
'programing' 카테고리의 다른 글
VB에서 DirectCast()와 CType()의 차이입니다.그물 (0) | 2023.05.07 |
---|---|
실행할 프로젝트를 찾을 수 없습니다.프로젝트가 D:\home\site\wwroot에 있는지 확인합니다. (0) | 2023.05.07 |
첫 번째 커밋을 어떻게 다시 시작합니까? (0) | 2023.05.07 |
SQL Server에서 "read committed"와 "repeatable read"의 차이 (0) | 2023.04.07 |
LEFT OUTER JOIN이 왼쪽 테이블에 있는 것보다 더 많은 레코드를 반환하려면 어떻게 해야 합니까? (0) | 2023.04.07 |