【问题标题】:Does PostgreSQL use all available indexes to run a query faster?PostgreSQL 是否使用所有可用索引来更快地运行查询?
【发布时间】:2022-08-19 00:37:05
【问题描述】:

我们正在构建一个项目,其中一些表将有许多记录,并且我们打算使用 4 个数字外键和 1 个数字主键,我们的假设是,如果我们为每个外键和主键的默认索引创建一个索引,则postgres 计划将使用所有开始(总共 5 个)来执行查询。

95% 的查询将提供至少 4 个外键。

  1. 是否会使用每个索引在记录的连续部分中更快地定位搜索?
  2. 拥有 4 个索引会提高查询速度,还是仅使用父级 (branch_id) 的单个索引就足够了?

    感谢您的时间和经验。

    例子:如果所有外键都有索引

    SELECT * FROM products WHERE 
    account_d=1 AND 
    organization_id=2 AND 
    business_id=3 AND 
    branch_id=4 AND 
    product_id=5;
    

    例子:如果我只指明主键的id

    SELECT * FROM products WHERE product_id=5;
    

    标签: sql postgresql indexing


    【解决方案1】:

    如果所有 4 列都由相等指定,则可以使用 BitmapAnd 组合单列索引。但是,这比在所有四列上使用一个多列索引效率低。

    由于这显然是一个非常常见的查询,因此拥有该多列索引是有意义的。

    通常你会想要索引每个外键列。否则,如果您想删除一个组织,例如,它需要扫描整个表以验证没有记录仍在引用它。无论哪一列是多列索引中的第一列,都不需要为其设置单列索引。但是其他不是第一个的 3 个可能仍然需要自己的索引。

    【讨论】:

    • 以我添加的查询示例为例,指示每个带有索引的外部 id 与仅指示外键的 id 的查询的性能是否会有任何改进?
    【解决方案2】:

    索引(主要)在过滤或连接表时使用,因此您提出的索引是否有用完全取决于您正在运行的 SQL 以及查询优化器是否确定使用索引是有益的。

    例如,如果您运行 SELECT * FROM TABLE,则不会使用任何索引。

    我无法具体评论 Postgresql,但是当您定义 PK/FK 时,许多/大多数 DBMS 会自动创建索引 - 所以无论如何您都会获得索引,无论您尝试实现任何性能调整

    【讨论】:

    • 以我添加的查询示例为例,指示每个带有索引的外部 id 与仅指示外键的 id 的查询的性能是否会有任何改进?
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2012-05-21
    • 2011-06-26
    相关资源
    最近更新 更多