2012-07-03 4 views
1

У меня есть приложение Rails, работающее с Mongoid на Heroku, и мне нужно настроить некоторые индексы, чтобы сделать базу данных быстрее. Я попытался прочитать об этом несколько мест, и я знаю, что у Mongoid есть встроенные функции для индексирования, но я не уверен, что их применять и как часто индексировать.Индексирование MongoDB на Heroku, с Rails и Mongoid

Это в основном мой дизайн-модель, которую я хочу, чтобы индекс:

scope :full_member_and_show, where(full_member: true).and(show: true).desc(:created_at) 
scope :not_full_member_and_show, where(full_member: false).and(show: true).desc(:created_at) 

embeds_many :comments 
belongs_to :designer 

search_in :tags_array 

attr_accessible :image, :tags, :description, :title, :featured, :project_number, :show 



field :width 
field :height 
field :description 
field :title 
field :tags, type: Array 
field :featured, :type => Boolean, :default => false 
field :project_number, :type => Integer, :default => 0 
field :show, :type => Boolean, :default => true 
field :full_member, :type => Boolean, :default => false 
field :first_design, :type => Boolean, :default => false 

Что мне нужно индексировать, как именно я это делаю с Mongoid и как часто я должен это делать?

ERROR UPDATE

Если попытаться индексировать ниже:

index({ full_member: 1, show: 1 }, { unique: true }) 

Он бросает мне эту ошибку:

Invalid index specification {:full_member=>1, :show=>1}; should be either a string, symbol, or an array of arrays. 

ответ

3

Вам не нужно индексировать периодически: как только вы добавлен индекс, mongo сохраняет этот индекс в актуальном состоянии по мере изменения коллекции. Это то же самое, что индекс в MySQL или Postgres (возможно, вы думали о чем-то вроде solr)

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

Вы говорите Mongoid, какие индексы вы хотите по индексу, например

class Person 
    include Mongoid::Document 
    index :city 
end 

Есть множество примеров в Mongoid документации для различных видов индексов Монго опор.

Затем запустите

rake db:mongoid:create_indexes 

Это определяет, какие индексы, которые вы хотите (на основе в вызовах index в вашей модели), а затем гарантирует, что они существуют в БД, создавая их, если это необходимо. В разработке вы запустили бы это после добавления индексов к вашим моделям. В производстве имеет смысл запустить это как часть вашего развертывания (вам нужно только, если вы добавили индексы с момента последнего развертывания, но проще просто сделать это систематически)

Существует много информации о том, как монго использует индексы в documentation

+0

Такой приятный ответ. Только то, что я искал. Благодаря! Я делаю это, чтобы сделать мою базу данных быстрее, поэтому я должен просто сделать индекс из каждого поля, которое я запрашиваю? Будет ли это лучше всего? –

+0

Mongo использует только один индекс для выполнения одного запроса, поэтому, если у вас есть запрос, который ссылается на 3 поля, он не будет использовать 3 отдельных индекса. Однако он может использовать составной индекс. Существуют также определенные типы запросов (например, запросы regex), которые не могут использовать индексы. В документах mongo есть куча информации о том, как монго использует индексы –

+0

Хорошо. Было бы лучше проиндексировать первое, что мы запрашиваем для этого? В этом случае - где (full_member: true)? –

Смежные вопросы