【发布时间】:2022-08-19 00:37:05
【问题描述】:
我们正在构建一个项目,其中一些表将有许多记录,并且我们打算使用 4 个数字外键和 1 个数字主键,我们的假设是,如果我们为每个外键和主键的默认索引创建一个索引,则postgres 计划将使用所有开始(总共 5 个)来执行查询。
95% 的查询将提供至少 4 个外键。
标签: sql postgresql indexing
我们正在构建一个项目,其中一些表将有许多记录,并且我们打算使用 4 个数字外键和 1 个数字主键,我们的假设是,如果我们为每个外键和主键的默认索引创建一个索引,则postgres 计划将使用所有开始(总共 5 个)来执行查询。
95% 的查询将提供至少 4 个外键。
标签: sql postgresql indexing
如果所有 4 列都由相等指定,则可以使用 BitmapAnd 组合单列索引。但是,这比在所有四列上使用一个多列索引效率低。
由于这显然是一个非常常见的查询,因此拥有该多列索引是有意义的。
通常你会想要索引每个外键列。否则,如果您想删除一个组织,例如,它需要扫描整个表以验证没有记录仍在引用它。无论哪一列是多列索引中的第一列,都不需要为其设置单列索引。但是其他不是第一个的 3 个可能仍然需要自己的索引。
【讨论】:
索引(主要)在过滤或连接表时使用,因此您提出的索引是否有用完全取决于您正在运行的 SQL 以及查询优化器是否确定使用索引是有益的。
例如,如果您运行 SELECT * FROM TABLE,则不会使用任何索引。
我无法具体评论 Postgresql,但是当您定义 PK/FK 时,许多/大多数 DBMS 会自动创建索引 - 所以无论如何您都会获得索引,无论您尝试实现任何性能调整
【讨论】: