【发布时间】:2014-07-23 01:37:23
【问题描述】:
我们有一个 Postgres 数据库,它通过解析 XML 并为我们加载数据集的节点应用程序填充。
我们已经构建了一个 Sinatra 应用程序来查看数据。我们有很多archive_objects,其中有很多tags。
我们通过它们的模型将这两个类关联起来,例如:
class ArchiveObject < ActiveRecord::Base
has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :archive_objects
end
我们注意到调用,例如 current_archive_object.tags 非常慢(平均 400+ms),在阅读 Using indexes in rails: Index your associations 之后,我看到了在 ActiveRecord 迁移中为这个简单关联创建索引的建议(名称此处修改相关性):
add_index :tags, :archive_object_id, :name => 'archive_object_id_idx'
我想知道,由于我们的数据库不是通过 AR 迁移生成的,如何直接在 psql 中创建此索引?
编辑: 关于我们的“联结表”的信息,是否相关
\d+ archive_objects_tags
Table "public.archive_objects_tags"
Column | Type | Modifiers | Storage | Stats target | Description
-------------------+--------------------------+-----------+---------+--------------+-------------
created_at | timestamp with time zone | not null | plain | |
updated_at | timestamp with time zone | not null | plain | |
tag_id | integer | not null | plain | |
archive_object_id | integer | not null | plain | |
Indexes:
"archive_objects_tags_pkey" PRIMARY KEY, btree (tag_id, archive_object_id)
Has OIDs: no
还有来自机架控制台的 SQL 调用:
Tag Load (397.4ms) SELECT "tags".* FROM "tags" INNER JOIN "archive_objects_tags" ON "tags"."id" = "archive_objects_tags"."tag_id" WHERE "archive_objects_tags"."archive_object_id" = $1 [["archive_object_id", 4823]]
【问题讨论】:
-
您可以创建迁移以添加索引。例如在迁移中放置
def changeadd_index :table, :column_to_be_indexedend
标签: ruby-on-rails ruby postgresql activerecord