了解与同一行中的索引列和非索引列数据相关的索引和性能

时间:2017-08-03 18:02:16

标签: postgresql

我有一些大约100列的表格。我没有对它们进行标准化,因为将它重新组合在一起需要几乎三十个连接,并且我不确定它会表现得更好......还没有测试它(我会)所以不能肯定地说。

无论如何,这真的不是问题。我一直在索引这些表中的列,我知道这些列会被频繁拉出,所以每个表就有50个索引。

我想到了。如果没有主键(基本上是项目编号),这些列将永远不会被自己拉动并且毫无意义。 PK将始终用于连接,即使在简单的SELECT查询中,它也必须是指定的列,因此数据才有意义。

这让我进一步思考索引及其工作原理。据我所知,值的位置被提交到该列的内存,因此可以在查询中快速找到它。

例如,如果你有:

SELECT itemnumber, expdate
FROM items;

itemnumberexpdate都被编入索引,是否过度并且真正增加了任何好处?仅仅索引itemnumber并且索引会知道expdate或者查询该项目的任何其他内容在同一行上是否足够?

其次,如果多个列构成主键,那么索引是否应将它们组合在一起,或者单独是否足够?

例如,

CREATE INDEX test_index ON table (pk_col1, pk_col2, pk_col3);

VS

CREATE INDEX test_index1 ON table (pk_col1);
CREATE INDEX test_index2 ON table (pk_col2);
CREATE INDEX test_index3 ON table (pk_col3);

感谢您提前清除它!

1 个答案:

答案 0 :(得分:1)

哦,有一大堆基础知识你还需要学习。

我建议你阅读PostgreSQL文档和优秀的书“SQL Performance Explained”

我将为您提供一些指导,帮助您入门:

  • 每当您创建PRIMARY KEYUNIQUE约束时,PostgreSQL会自动在该约束的所有列上创建唯一索引。因此,您不必显式创建该索引(但如果它是多列索引,则有时在除第一列之外的任何索引上创建另一个索引时很有用。)

  • 索引与WHERE子句和GROUP BY子句中的条件相关,并且在某种程度上与表连接相关。它们与SELECT列表中的条目无关。索引提供了一种有效的方法来获取满足特定条件的表的一部分;对表的所有行的(未排序)访问永远不会从索引中受益。

请不要随意为您的架构撒上索引,因为索引会占用空间并使所有数据修改变慢。

知道他们会做得好的地方使用它们:在定义了外键的列上,在WHERE子句中出现的列上,包含许多不同的值,在列上您对执行计划的检查(EXPLAIN)表明您可以获得绩效优势。