Когда мне нужно вызвать securityIndex? Прежде чем вставлять одну запись, после вставки одной записи или перед вызовом find()?
Привет,
Джонни
Когда мне нужно вызвать securityIndex? Прежде чем вставлять одну запись, после вставки одной записи или перед вызовом find()?
Привет,
Джонни
Кажется, мой комментарий был немного непонят, поэтому я уточню. Это не имеет большого значения, когда вы называете это, пока он вызывает в какой-то момент, прежде чем вы вызовете find() в первый раз. Другими словами, это не имеет большого значения, когда вы создаете индекс, до тех пор, пока он не будет использоваться для его использования.
Общим шаблоном, который я видел много, является кодирование ensureIndex
в то же время (и там же) как вызов find()
. ensureIndex
будет проверять, существует ли индекс и создать его, если это не так. Несомненно, некоторые накладные расходы (хотя и очень маленькие) при вызове securityindex перед вызовом find(), поэтому предпочтительнее не делать этого.
Я вызываю ensureIndex
в коде, чтобы упростить развертывание и избежать необходимости отдельно управлять db и codebase. Компромисс простоты развертывания уравновешивает избыточность последующих вызовов для обеспеченияIndex (для меня.)
Я бы рекомендовал вызвать securityIndex один раз, когда ваше приложение запустится.
Это не имеет значения, но вам нужно только сделать это один раз. Если вы хотите вставлять большой объем данных в пустую коллекцию, лучше всего создать индекс после вставок, но в противном случае это не имеет особого значения.
Вам нужно сделать это только один раз. Пример:
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
Если вы добавляете индекс перед рукой, каждый вызов insert/update/delete должен также изменять каждый индекс. Таким образом, с точки зрения оптимизации вы, вероятно, захотите отложить ее как можно дольше, прежде чем выпускать запросы. Однако, с точки зрения функциональности, это не имеет значения.
Я обычно помещаю свои вызовы ensureIndex()
в блок init для части моего приложения, которое управляет связью с MongoDB. Кроме того, я обертываю эти вызовы ensureIndex()
внутри проверки на наличие коллекции, которую я знаю, должен существовать для приложения для работы; Таким образом, вызовы secureIndex() вызываются только когда-либо, когда-либо, при первом запуске приложения с конкретным экземпляром MongoDB.
Я читал в другом месте мнение против включения вызовов securityIndex() в код приложения, поскольку другие разработчики могут ошибочно изменять их и изменять БД (индексы), но обертывание его в чек для существования коллекции помогает защитить это.
Пример драйвера 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 not already)
DBCollection coll = db.getCollection("collectionName");
if (!existingCollectionNames.contains("collectionName")) {
// ensure indexes...
coll.ensureIndex(BasicDBObjectBuilder.start().add("date", 1).get());
// ...
}
Если у вас есть коллекция, в которой есть миллионы записей, и вы создаете несколько составных индексов с отключенной автоматической индексацией, вы ДОЛЖНЫ обеспечить, чтобы вы вызывали securityIndexes() задолго до вашего первого поиска, возможно, синхронно, то есть после метода makeIndexes возвращается.
Режим (переднего и заднего), в котором индексы строятся, добавляет дополнительную сложность. Режим Foreground блокирует полный db, когда он строит индексы, тогда как фоновый режим позволяет вам запрашивать db. Однако фоновый режим построения индекса занимает дополнительное время.
Итак, вы должны убедиться, что индексы были созданы успешно. Вы можете использовать db.currentOp(), чтобы проверить прогресс обеспеченияIndexes(), пока он все еще создает индексы.