Hello,
Say, I have a pictures table, and there are many objects which can have
pictures, so I define a picturable type. Now, to make the query for pictures
more efficient I should index the picture table using both picturable_type and
picturable_id.
Is this the correct approach to indexing the table, or can things be done
better? I want the database retrieval operation to be extremely fast (I have
some other types such as votes, which require many queries and the speed of
query retrieval is important).
Thanks in advance for your help and suggestions.
create_table :pictures do |table|
table.column :name, :string, :limit => 100
table.column :content_type, :string, :limit => 100
table.column :data, :blob
table.column :picturable_id, :int, :null => false
table.column :picturable_type, :string, :limit => 10, :null => false
end
add_index :pictures, [:picturable_type], :name =>
"pictures_index_picturable_type"
add_index :pictures, [:picturable_id], :name =>
"pictures_index_picturable_id"
--
Surendra Singhi
http://ssinghi.kreeti.com, http://www.kreeti.com
Read my blog at: http://cuttingtheredtape.blogspot.com/
,----
| "War is Peace! Freedom is Slavery! Ignorance is Strength!"
| -- Orwell, 1984, 1948
`----
On Apr 02, 2006, at 12:08 pm, Surendra Singhi wrote:> Is this the correct approach to indexing the table, or can things > be done > better? I want the database retrieval operation to be extremely > fast (I have > some other types such as votes, which require many queries and the > speed of > query retrieval is important).Surendra, How many pictures do you expect to store? Indexes only get used when the database expects it will return rows faster than a sequential scan. If your images are large and few, it may actually take longer to extract the blob than to find the record containing it.> add_index :pictures, [:picturable_type], :name => > "pictures_index_picturable_type" > add_index :pictures, [:picturable_id], :name => > "pictures_index_picturable_id"As I understand it, the pictures table will always be searched on both foreign ID and type, so you could create a composite index: add_index :pictures, [:picturable_type, :picturable_id], :name => "pictures_index_picturable_type_id" Ashley
Surendra Singhi
2006-Apr-02 15:13 UTC
[Rails] Re: rails db indexing and through association
Hello Ashley, Ashley Moran <work@ashleymoran.me.uk> writes:> On Apr 02, 2006, at 12:08 pm, Surendra Singhi wrote: >> Is this the correct approach to indexing the table, or can things >> be done >> better? I want the database retrieval operation to be extremely >> fast (I have >> some other types such as votes, which require many queries and the >> speed of >> query retrieval is important). > >> add_index :pictures, [:picturable_type], :name => >> "pictures_index_picturable_type" >> add_index :pictures, [:picturable_id], :name => >> "pictures_index_picturable_id" > > As I understand it, the pictures table will always be searched on > both foreign ID and type, so you could create a composite index: > > add_index :pictures, [:picturable_type, :picturable_id], :name > => "pictures_index_picturable_type_id" >Thanks, this is what I was looking for. -- Surendra Singhi http://ssinghi.kreeti.com, http://www.kreeti.com Read my blog at: http://cuttingtheredtape.blogspot.com/ ,---- | "All animals are equal, but some animals are more equal than others." | -- Orwell, Animal Farm, 1945 `----