【问题标题】:How to index already created data in rails?如何在rails中索引已经创建的数据?
【发布时间】:2020-01-29 11:45:27
【问题描述】:

我正在尝试为表中包含超过 500 万条数据的已创建列建立索引。我的问题是,如果我在迁移中添加索引,已经创建的数据也会被索引吗?或者如果需要,我是否需要重新索引创建的数据?

这是我的迁移

add_index :data_prods, :date_field
add_index :data_prods, :entity_id

谢谢。

编辑 我正在使用 PostgreSQL 数据库管理系统。

【问题讨论】:

  • 您使用的是什么 DBMS?
  • 我正在使用 PostgreSQL。
  • 索引属于表,不属于表中的行。创建您的索引并快乐。
  • 所以这会使查询更快对吧?由于数据量太大,我遇到了加载问题。

标签: postgresql


【解决方案1】:

添加索引的过程会重新索引整个表格内容。一个有 500 万行的表可能需要一些时间,我建议在暂存环境(具有相似的数据量)中进行测试,以了解此迁移需要多长时间,以及对应用程序的影响。

Re:您关于改进查询时间的评论

索引将使查询更快,索引列通常在“where”子句中引用。在您的情况下,您按date_fieldentity_id 过滤的任何查询都会更快,但其他查询不会得到改进。需要注意的是,每个查询只会使用 1 个索引,如果您的大多数查询同时使用 date_fieldentity_id 来过滤数据,您可能最好使用复合索引。我可以查看这篇文章以进一步阅读复合索引。 Index on multiple columns in Ruby on Rails

【讨论】:

  • 总是可以使用connection.execute 来同时创建索引以帮助避免停机。虽然这会使索引的创建花费更长的时间。
  • @gdxn96 所以复合索引对我来说可能更好,因为我在大多数查询中都使用这种组合。
  • @Int'lManOfCodingMystery 你能解释一下如何在不停机的情况下使用 connetion.execute。
  • @Amal ,使用 connection.execute 您可以运行原始 SQL 命令。因此,在您的索引中,您可以执行类似create index concurrently idx_index_name on table_name using btree (column1) 的操作,使用并发标志创建索引将防止表锁定。 postgresql.org/docs/9.1/sql-createindex.html
猜你喜欢
  • 2014-01-25
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2020-03-25
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多