1

Heroku で Mongoid を実行している 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 を使用してどのように正確にインデックスを作成し、どのくらいの頻度でインデックスを作成する必要がありますか?

エラー更新

以下にインデックスを付けようとすると:

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.
4

1 に答える 1

3

定期的にインデックスを作成する必要はありません。インデックスを追加すると、mongo はコレクションの変更に合わせてそのインデックスを最新の状態に保ちます。これは、MySQL や Postgres のインデックスと同じです (solr のようなものを考えていたかもしれません)。

何にインデックスを付けるかは、データセットに対して行うクエリによって異なります。インデックスは、更新を行ってディスク領域を消費するときにいくらかのオーバーヘッドをもたらすため、不要なときにインデックスを追加したくありません。

たとえば、必要なインデックスをインデックスでmongoidに伝えます。

class Person
  include Mongoid::Document
  index :city
end

mongoid のドキュメントには、mongo がサポートするさまざまな種類のインデックスの例がたくさんあります。

それからあなたは走ります

rake db:mongoid:create_indexes

これにより、(モデル内の呼び出しに基づいて) 必要なインデックスが決定され、indexそれらがデータベースに存在することが保証され、必要に応じて作成されます。開発中は、モデルにインデックスを追加した後にこれを実行します。本番環境では、デプロイの一部としてこれを実行するのが理にかなっています (前回のデプロイ以降にインデックスを追加した場合にのみ必要ですが、体系的に行う方が簡単です)。

ドキュメントには、mongo がインデックスを使用する方法に関する多くの情報があります。

于 2012-07-03T17:25:27.810 に答える