Это не имеет значения. Я просто попробовал это на выборке, содержащей 384 записи. Согласно explain()
, сканирование индекса заняло 0 мс, в то время как сканирование коллекции первого заняло 2 мс - каждое последующее сканирование коллекции заняло 0 мс.
Это решение зависит от размера коллекции?
Да, идея индекса заключается в том, что он добавляет затраты на создание и обновление данных, которые амортизируются путем ускорения запросов. В частности, простой список имеет асимптотическую производительность вставки O (1) и время поиска O (N), тогда как B-Tree имеет O (log n) для обоих, то есть мы принимаем более медленные вставки, потому что мы предполагаем, что мы читаем более часто, чем мы пишем, или данные настолько велики, что даже несколько O (N) считываний будут влиять на производительность, т. е. если N >> log N.
Всего лишь несколько сотен элементов, все это не потому что разница между log n и n мала, а потому, что более сложный служебный ресурс сложного алгоритма (т. е. постоянный фактор, который скрыт через Landau-Notation, потому что он в значительной степени зависит от реализации) играет в той же лиге. То же самое относится и к вашему коду: нет смысла ставить 200 элементов в хэш-таблицу, итерация списка может быть даже быстрее, поскольку она позволяет избежать разветвления.
Если документы огромны, сканирование коллекции придется пресекать больше данных (вместо того, чтобы просто смотреть на индекс).
Когда мы воздерживаемся от создания дополнительных индексов в поле, которые мы не будем регулярно запрашивать, мы делаем этот выбор, поскольку стоимость создания индекса перевыполняет преимущества в предоставлении. В подобных строках я пытаюсь спросить, имеет ли смысл платить стоимость создания индекса за небольшую статическую коллекцию. – tunetopj