ActiveRecord с Postgres: имеет много сквозного и индексирования
Допустим, у вас есть три модели:
class Collection < ActiveRecord::Base
has_many :comments, through => :users
end
class User < ActiveRecord::Base
belongs_to :collection
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :user
end
С индексами вроде так:
add_index :users, :collection_id
add_index :comments, :user_id
Если у вас есть запрос коллекции для его комментариев:
@collection.comments
Будет ли он использовать оба индекса?
Редактировать:
Это создает запрос, который выглядит следующим образом:
SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments"."user_id" = "users"."id" WHERE "users"."collection_id" = 232
Используя EXPLAIN, он утверждает, что использует только "индексное сканирование с использованием index_users_on_collection_id для пользователей"
Таким образом, по-видимому, он быстро получает пользователей из индекса пользователя на collection_id, но затем просматривает ВСЕ комментарии, присоединяясь к ним с пользователями? Будет ли этот запрос работать плохо, если будет много комментариев (гипотетически, например, 100 000)?
Спасибо.
1 ответ
Вы не можете полагаться на план EXPLAIN для маленького стола, который будет одинаковым для большого стола. Планы меняются по мере изменения размеров таблицы.
При этом, если в конечном итоге выполняется последовательное сканирование по комментариям и имеется большое количество строк, вы можете убедиться, что в поле внешнего ключа в таблице комментариев есть индекс. PostgreSQL будет использовать индекс, если он оценит, что это будет чистый выигрыш с точки зрения дискового ввода-вывода, и это означает, что таблица достаточно велика, чтобы извлечь выгоду из использования сканирования индекса, и что сканирование индекса не будет извлекать большую часть стола.