主键列是否包含在二级索引的末尾
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不区分主从索引,主键索引与其他索引没有区别。所以主键不会添加到其他索引中,除非有特殊原因,否则这样做没有意义。
根据哪些条件是选择性的,存在三种可能的策略:
如果bar.name
上的条件是选择性的,则使用bar
作为驱动站点:
CREATE INDEX ON bar (name);
-- foo.id is already indexed
如果foo.name
的条件是选择性的:
CREATE INDEX ON foo (name);
CREATE INDEX ON bar(foo_id); -- for a nested loop join
如果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
鉴于这些表格
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不区分主从索引,主键索引与其他索引没有区别。所以主键不会添加到其他索引中,除非有特殊原因,否则这样做没有意义。
根据哪些条件是选择性的,存在三种可能的策略:
如果
bar.name
上的条件是选择性的,则使用bar
作为驱动站点:CREATE INDEX ON bar (name); -- foo.id is already indexed
如果
foo.name
的条件是选择性的:CREATE INDEX ON foo (name); CREATE INDEX ON bar(foo_id); -- for a nested loop join
如果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