我有一些大约100列的表格。我没有对它们进行标准化,因为将它重新组合在一起需要几乎三十个连接,并且我不确定它会表现得更好......还没有测试它(我会)所以不能肯定地说。
无论如何,这真的不是问题。我一直在索引这些表中的列,我知道这些列会被频繁拉出,所以每个表就有50个索引。
我想到了。如果没有主键(基本上是项目编号),这些列将永远不会被自己拉动并且毫无意义。 PK将始终用于连接,即使在简单的SELECT
查询中,它也必须是指定的列,因此数据才有意义。
这让我进一步思考索引及其工作原理。据我所知,值的位置被提交到该列的内存,因此可以在查询中快速找到它。
例如,如果你有:
SELECT itemnumber, expdate
FROM items;
itemnumber
和expdate
都被编入索引,是否过度并且真正增加了任何好处?仅仅索引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);
感谢您提前清除它!
答案 0 :(得分:1)
哦,有一大堆基础知识你还需要学习。
我建议你阅读PostgreSQL文档和优秀的书“SQL Performance Explained”。
我将为您提供一些指导,帮助您入门:
每当您创建PRIMARY KEY
或UNIQUE
约束时,PostgreSQL会自动在该约束的所有列上创建唯一索引。因此,您不必显式创建该索引(但如果它是多列索引,则有时在除第一列之外的任何索引上创建另一个索引时很有用。)
索引与WHERE
子句和GROUP BY
子句中的条件相关,并且在某种程度上与表连接相关。它们与SELECT
列表中的条目无关。索引提供了一种有效的方法来获取满足特定条件的表的一部分;对表的所有行的(未排序)访问永远不会从索引中受益。
请不要随意为您的架构撒上索引,因为索引会占用空间并使所有数据修改变慢。
在知道他们会做得好的地方使用它们:在定义了外键的列上,在WHERE
子句中出现的列上,包含许多不同的值,在列上您对执行计划的检查(EXPLAIN
)表明您可以获得绩效优势。