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 будет использовать индекс, если он оценит, что это будет чистый выигрыш с точки зрения дискового ввода-вывода, и это означает, что таблица достаточно велика, чтобы извлечь выгоду из использования сканирования индекса, и что сканирование индекса не будет извлекать большую часть стола.

Другие вопросы по тегам