Mongodb: когда вызывать sureIndex? - PullRequest
40 голосов
/ 09 августа 2011

Когда я должен позвонить sureIndex?Перед вставкой одной записи, после вставки одной записи или перед вызовом find ()?

С уважением,

Джонни

Ответы [ 7 ]

18 голосов
/ 09 августа 2011

Кажется, мой комментарий был немного неправильно понят, поэтому я уточню.На самом деле не имеет значения, когда вы вызываете его , если он вызывается в какой-то момент, прежде чем вы вызовете find () в первый раз. Другими словами, это не имеет значения, когда вы создаете индексДо тех пор, пока он там, прежде чем вы ожидаете его использовать.

Обычный шаблон, который я часто видел, - это кодирование ensureIndex в то же время (и в том же месте), что и вызов find().ensureIndex проверит, существует ли индекс, и создаст его, если его нет.Несомненно, есть некоторые издержки (хотя и очень маленькие) при вызове sureindex перед вызовом find (), поэтому желательно этого не делать.

Я вызываю ensureIndex в коде, чтобы упростить развертывание и избежать необходимости отдельно управлять базой данных и базой кода.Компромисс простоты развертывания уравновешивает избыточность последующих вызовов, чтобы обеспечитьIndex (для меня.)

15 голосов
/ 16 августа 2012

Я бы порекомендовал вызывать sureIndex один раз, когда ваше приложение запускается.

3 голосов
/ 09 августа 2011

Это не имеет значения, но вы должны сделать это только один раз. Если вы хотите пакетно вставить большой объем данных в пустую коллекцию, то лучше всего создать индекс после вставок, но в остальном это не имеет значения.

2 голосов
/ 09 августа 2011

Вам нужно сделать это только один раз. Пример:

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
1 голос
/ 24 марта 2016

Если у вас есть коллекция с миллионами записей, и вы создаете несколько составных индексов с отключенной автоматической индексацией, тогда вы ДОЛЖНЫ убедиться, что вы вызываете sureIndexes () задолго до первого запроса на поиск, возможно, синхронно, т.е. после метода sureIndexesвозвращает.

Режим (передний план против фона), в котором создаются индексы, добавляет дополнительную сложность.Режим переднего плана блокирует полную базу данных, пока он строит индексы, тогда как фоновый режим позволяет запрашивать базу данных.Однако фоновый режим построения индекса требует дополнительного времени.

Поэтому вы должны убедиться, что индексы были созданы успешно.Вы можете использовать db.currentOp (), чтобы проверять ход выполнения sureIndexes (), пока он еще создает индексы.

1 голос
/ 16 октября 2013

Я обычно помещаю свои ensureIndex() вызовы в блок init для части моего приложения, которая управляет связью с MongoDB. Кроме того, я обертываю эти ensureIndex() вызовы в проверку существования коллекции, которая, как я знаю, должна существовать, чтобы приложение работало; таким образом, вызовы sureIndex () вызываются только один раз, при первом запуске приложения для определенного экземпляра MongoDB.

Я читал в другом месте мнение о том, что в код приложения не следует помещать вызовы sureIndex (), так как другие разработчики могут по ошибке изменить их и изменить базу данных (индексы), но включение ее в проверку существования коллекции помогает избежать это.

Пример драйвера 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());
    // ...
}
1 голос
/ 10 августа 2011

Если вы добавляете индекс заранее, каждый вызов вставки / обновления / удаления также должен модифицировать каждый индекс.Таким образом, с точки зрения оптимизации, вы, вероятно, хотите отложить это как можно дольше, прежде чем отправлять запросы.Однако с функциональной точки зрения это не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...