在我的应用程序中,我通常使用主键作为访问数据的方式。但是我被告知为了提高性能,我应该在我的表中索引列,但是我不知道应该索引哪些列。
现在问题:
1)将主键作为索引是否是一个好主意?(假设主键是唯一的,一个id
2)我怎么知道要索引的列?
答案 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!。