我有一些大约 100 列宽的表格。我还没有将它们规范化,因为要将其重新组合在一起需要近 3 打联接,并且不确定它的性能会更好......还没有测试过(我会(,所以不能肯定地说。
无论如何,这真的不是问题。我一直在索引这些表中的列,我知道这些列会被频繁拉取,所以每个表大约有 50 个索引。
不过我开始思考。这些列永远不会自己拉取,没有主键(基本上是一个项目编号(就毫无意义。PK 将始终用于连接,即使在简单的SELECT
查询中,它也必须是指定的列,以便数据有意义。
这让我进一步思考索引及其工作原理。据我了解,值的位置被提交到该列的内存中,因此可以在查询中快速找到它。
例如,如果您有:
SELECT itemnumber, expdate
FROM items;
而且itemnumber
和expdate
都被索引,这是否过多,真的增加了任何好处?是否只需索引itemnumber
,索引就会知道expdate
或为该项查询的任何其他内容在同一行上?
其次,如果多个列构成一个主键,索引应该将它们组合在一起,还是单独包含足够?
例如
CREATE INDEX test_index ON table (pk_col1, pk_col2, pk_col3);
与。
CREATE INDEX test_index1 ON table (pk_col1);
CREATE INDEX test_index2 ON table (pk_col2);
CREATE INDEX test_index3 ON table (pk_col3);
感谢您提前清理!
呃,哦,还有一大堆基础知识需要你学习。
我建议您阅读PostgreSQL文档和优秀的书籍"SQL性能解释"。
我会给你一些指示来帮助你开始:
每当您创建
PRIMARY KEY
或UNIQUE
约束时,PostgreSQL 都会自动在该约束的所有列上创建一个唯一索引。因此,您不必显式创建该索引(但如果它是多列索引,则有时在除第一列之外的任何列上创建另一个索引很有用(。索引与
WHERE
子句和GROUP BY
子句中的条件相关,在某种程度上与表连接相关。它们与SELECT
列表中的条目无关。索引提供了一种有效的方法来获取满足特定条件的表部分;对表的所有行的(未排序(访问永远不会从索引中受益。
不要随机在架构中散布索引,因为索引会占用空间并使所有数据修改变慢。
在你知道它们会起作用的地方使用它们:在定义外键的列上,在出现在WHERE
子句中并包含许多不同值的列上,在检查执行计划(带EXPLAIN
(表明您可以期望性能优势的列上。