主键列是否包含在二级索引的末尾

Is primary key column included at the end of a secondary index

鉴于这些表格

Foo
 id (PK)
 name
 updated
Bar
 foo_id (FK)
 name
 updated

这个查询:

SELECT * 
FROM Foo as f
JOIN Bar as b
ON f.id=b.foo_id
WHERE b.name = 'Baz' AND f.name = 'Baz'
ORDER BY f.updated ASC, f.id ASC
LIMIT 10
OFFSET 10

是否要添加这些适当的索引 - 在MySql InnoDB 中,主键列会自动添加到辅助索引的末尾。 Postgres 的情况如何?

CREATE INDEX foo_name_id_idx ON foo(name, id)
CREATE INDEX bar_name_id_idx ON bar(name, id)

PostgreSQL不区分主从索引,主键索引与其他索引没有区别。所以主键不会添加到其他索引中,除非有特殊原因,否则这样做没有意义。

根据哪些条件是选择性的,存在三种可能的策略:

  1. 如果bar.name上的条件是选择性的,则使用bar作为驱动站点:

    CREATE INDEX ON bar (name);
    -- foo.id is already indexed
    
  2. 如果foo.name的条件是选择性的:

    CREATE INDEX ON foo (name);
    CREATE INDEX ON bar(foo_id);  -- for a nested loop join
    
  3. 如果none个条件是选择性的:

    /* here the "id" is actually at the end of the index,
       but that is just because it appears in ORDER BY */
    CREATE INDEX ON foo (name, updated, id);  -- for the ORDER BY
    CREATE INDEX ON bar (foo_id);  -- for a nested loop join