使用主键作为索引

时间:2013-08-20 13:50:00

标签: mysql database postgresql indexing database-performance

在我的应用程序中,我通常使用主键作为访问数据的方式。但是我被告知为了提高性能,我应该在我的表中索引列,但是我不知道应该索引哪些列。

现在问题:

1)将主键作为索引是否是一个好主意?(假设主键是唯一的,一个id

2)我怎么知道要索引的列?

4 个答案:

答案 0 :(得分:3)

1)Primary keys使用Postgres中的唯一索引自动实施。
The same is true for MySQL.

你在这里完成了。

2)关于其他指数的建议,请考虑这个密切相关的答案:
Optimize PostgreSQL read-only tables

同样,MySQL和Postgres的基础是相同的。但是,如果您需要,Postgres会提供更多高级功能,例如partial or functional indices。但是,从基础开始。

答案 1 :(得分:0)

您的主键已经拥有PostgreSQL自动为您创建的索引。您无需再次索引列。

就其他领域而言,请看一下这里关于计算基数的文章: http://kirk.webfinish.com/2013/08/some-help-to-find-uniqueness-in-a-large-table-with-many-fields/

完全唯一的字段是候选字段,完全没有唯一性的字段对索引无用。甜蜜点是中间的基数(.5)。

当然,您应该查看WHERE子句中使用的列。索引不属于您的quals的列是没用的。

答案 2 :(得分:0)

只有在正式将主键定义为主键时,主键才会有一个idex。大多数人忘记制作索引的地方是Foriegn键,它们通常不会自动编入索引,并且几乎总是会参与连接并因此编入索引。索引的其他候选者是经常过滤数据的东西,其中包含大量可能的值,例如名称,部件号,开始日期等。

答案 3 :(得分:0)

  

1)将主键作为索引是否是一个好主意?(假设主键是唯一的,一个id

我所知道的所有DBMS都会自动在PK下创建一个索引。

对于MySQL / InnoDB,PK不会被编入索引,但该索引将为clustered index

(顺便说一句,只是说“主键”意味着它是唯一的,所以没有必要明确说明“假设主键是唯一的”。)

  

2)我怎么知道要索引的列?

这取决于需要支持哪些查询。

但要注意添加索引不是免费的并且是工程权衡的问题 - 虽然某些查询可能会从索引中受益,但实际上有些查询可能会受到影响。例如:

  • FOO上的索引会显着加快SELECT * FROM T WHERE FOO = ...
  • 但是,相同的索引会稍微降低INSERT INTO T VALUES (...)
  • 的速度

在大多数情况下,你喜欢SELECT中的大加速而不是INSERT中的小减速,但情况可能并非总是如此。

索引和数据库性能通常是一个复杂的主题,超出了简陋的StackOverflow帖子的范围,但如果您有兴趣,我热烈建议阅读Use The Index, Luke!

相关问题