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

  • 本文关键字:索引 数据 性能 一行 了解 postgresql
  • 更新时间 :
  • 英文 :


我有一些大约 100 列宽的表格。我还没有将它们规范化,因为要将其重新组合在一起需要近 3 打联接,并且不确定它的性能会更好......还没有测试过(我会(,所以不能肯定地说。

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

不过我开始思考。这些列永远不会自己拉取,没有主键(基本上是一个项目编号(就毫无意义。PK 将始终用于连接,即使在简单的SELECT查询中,它也必须是指定的列,以便数据有意义。

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

例如,如果您有:

SELECT itemnumber, expdate
FROM items;

而且itemnumberexpdate都被索引,这是否过多,真的增加了任何好处?是否只需索引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 KEYUNIQUE约束时,PostgreSQL 都会自动在该约束的所有列上创建一个唯一索引。因此,您不必显式创建该索引(但如果它是多列索引,则有时在除第一列之外的任何列上创建另一个索引很有用(。

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

不要随机在架构中散布索引,因为索引会占用空间并使所有数据修改变慢。

你知道它们会起作用的地方使用它们:在定义外键的列上,在出现在WHERE子句中并包含许多不同值的列上,在检查执行计划(带EXPLAIN(表明您可以期望性能优势的列上。

最新更新