普通索引是否也可以通过创建唯一索引来工作?

时间:2017-05-18 09:14:52

标签: 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

谢谢。

1 个答案:

答案 0 :(得分:1)

索引是数据库中的一个对象,如果查询计划程序决定它是合适的,它可用于更快地查找数据。所以对你的问题的简单回答是" no",创建一个索引不会导致数据库中的结构与创建三个不同的索引相同。

我认为你真正想知道的是:

  

我是否需要所有三个索引,或者唯一索引是否已优化所有查询?

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

以下是一些注意事项:

  • 多列索引中列的顺序很重要。如果你有一个按姓氏和名字排序的人的索引,那么你可以用它来搜索姓氏相同的人;但是当你只知道他们的名字时,你可能无法用它来搜索某人。
  • 数据分发很重要。如果列表中的每个人都有姓氏"史密斯"和"琼斯"然后你可以使用姓氏第一索引来相当容易地搜索名字(只需在琼斯下查找,然后在史密斯下查找)。
  • 索引大小很重要。索引具有的列越少,它一次适合内存的次数越多,因此使用的速度就越快。

通常,查询计划员可以使用多个索引,其作用是估算您编写的查询的上述因素的成本。

通常,创建多个您认为可能有帮助的索引并不会造成伤害,但它会耗尽磁盘空间,偶尔会导致查询计划程序选择更糟糕的计划。因此,最好的方法是始终使用一些实际数据填充数据库,并查看一些真实查询的查询计划。