0

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

现在的问题:

  1. 在主键上创建索引是个好主意吗?

  2. 我怎么知道要索引哪些列?

4

5 回答 5

3
  1. 在主键上创建索引是个好主意吗?

主键在 Postgres 中使用唯一索引自动实现。你在这里完成了。
MySQL 也是如此。看:

  1. 我怎么知道要索引哪些列?

有关其他指数的建议,请参阅:

同样,MySQL 和 Postgres 的基础是相同的。但是 Postgres 有更高级的特性,比如部分索引或函数索引,如果你需要的话。不过,从基础开始。

于 2013-08-20T14:00:10.990 回答
0

您的主键已经有一个由 PostgreSQL 自动为您创建的索引。您不需要再次索引该列。

至于其他领域,看看这里关于找出基数的文章:http: //kirk.webfinish.com/2013/08/some-help-to-find-uniqueness-in-a-多字段的大表/

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

当然,您应该看看您在 WHERE 子句中使用了哪些列。索引不属于您的资格的列是没有用的。

于 2013-08-20T14:01:44.047 回答
0

仅当您正式将它们定义为主键时,主键才会有一个索引。大多数人忘记创建索引的地方是外键,它们通常不会自动索引,并且几乎总是会参与连接并因此被索引。索引的其他候选对象是您经常过滤具有大量可能值的数据的对象,例如名称、部件号、开始日期等。

于 2013-08-20T17:15:48.413 回答
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!.

于 2013-08-27T16:49:38.133 回答
0
  1. 您的主键将始终是索引。

  2. 始终在有助于减少搜索的列中创建索引,例如,如果在一千多个列中只有 3 个不同的值,则使其成为索引是一个好兆头。

于 2021-09-03T22:19:25.773 回答