在我的应用程序中,我通常使用主键作为访问数据的一种方式。但是,有人告诉我,为了提高性能,我应该索引表中的列。但我不知道要索引哪些列。
现在的问题:
在主键上创建索引是个好主意吗?
我怎么知道要索引哪些列?
在我的应用程序中,我通常使用主键作为访问数据的一种方式。但是,有人告诉我,为了提高性能,我应该索引表中的列。但我不知道要索引哪些列。
现在的问题:
在主键上创建索引是个好主意吗?
我怎么知道要索引哪些列?
您的主键已经有一个由 PostgreSQL 自动为您创建的索引。您不需要再次索引该列。
至于其他领域,看看这里关于找出基数的文章:http: //kirk.webfinish.com/2013/08/some-help-to-find-uniqueness-in-a-多字段的大表/
完全唯一的字段是候选字段,完全没有唯一性的字段对索引毫无用处。最佳点是中间的基数 (.5)。
当然,您应该看看您在 WHERE 子句中使用了哪些列。索引不属于您的资格的列是没有用的。
仅当您正式将它们定义为主键时,主键才会有一个索引。大多数人忘记创建索引的地方是外键,它们通常不会自动索引,并且几乎总是会参与连接并因此被索引。索引的其他候选对象是您经常过滤具有大量可能值的数据的对象,例如名称、部件号、开始日期等。
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!.
您的主键将始终是索引。
始终在有助于减少搜索的列中创建索引,例如,如果在一千多个列中只有 3 个不同的值,则使其成为索引是一个好兆头。