ruby-on-rails - 普通索引也可以通过创建唯一索引来工作吗?

标签 ruby-on-rails postgresql ruby-on-rails-4

大家好,我想知道,如果我在 postgreSQL 上创建两列的唯一索引,两列的正常索引是否也可以通过相同的唯一索引工作,或者我必须为两者创建一个唯一索引和另外两个索引代码中显示的列?我想创建 talent_id、job_id 的唯一索引,而且这两列应该单独索引。我阅读了很多资源,但没有得到合适的答案。

add_index :talent_actions, [:talent_id, :job_id], unique: true

上面的代码是否也处理下面的索引,或者我必须单独添加下面的索引?

add_index :talent_actions, :talent_id
add_index :talent_actions, :job_id

谢谢。

最佳答案

索引是数据库中的一个对象,如果查询规划器认为合适的话,它可以用来更快地查找数据。因此,对您的问题的简单回答是“否”,创建一个索引不会在数据库中产生与创建三个不同索引相同的结构。

我想你真正想知道的是:

Do I need all three indexes, or will the unique index already optimise all queries?

这与任何数据库优化一样,取决于您运行的查询和您拥有的数据。

这里有一些注意事项:

  • 多列索引中列的顺序很重要。如果你有一个按姓然后名排序的人的索引,那么你可以用它来搜索所有具有相同姓氏的人;但是当您只知道某人的名字时,您可能无法使用它来搜索某人。
  • 数据分发很重要。如果您列表中的每个人都有姓氏“Smith”和“Jones”,那么您可以使用姓氏优先索引来相当轻松地搜索名字(只需在 Jones 下查找,然后在 Smith 下查找)。
  • 索引大小很重要。索引的列数越少,一次可放入内存的列数越多,因此使用速度越快。

通常,查询规划器可以使用多个索引,它的工作是为您编写的查询估算上述因素的成本。

通常,创建多个您认为可能有用的索引并没有坏处,但它确实会耗尽磁盘空间,并且偶尔会导致查询计划器选择更糟糕的计划。因此,最好的方法始终是用一些真实数据填充数据库,并查看一些真实查询的查询计划。

关于ruby-on-rails - 普通索引也可以通过创建唯一索引来工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043510/

相关文章:

mysql - ubuntu上的rails mysql gem问题

database - pgAdmin 4 - 查询工具自动完成的性能很差,这正常吗?

postgresql - 第一次尝试使用Docker : Error response from daemon: driver failed programming external connectivity on endpoint webserver (2d9

ruby-on-rails-4 - RSpec 3.4/Rails 4.2 : how to test view containing button_to

ruby-on-rails - Google Geocoding API 错误 : over query limit. - Rails

ruby-on-rails - Rails 急切加载似乎查询错误

ruby-on-rails - 如何修复 Ruby 中的 "String to Integer"错误

ruby-on-rails - 嵌套的content_tags逸出内部html。为什么?

PostgreSQL 选择...更新 : What happens with concurrent long running queries?

ruby-on-rails - Rails 服务器上的 NoMethodError