Mik*_*kov 6 postgresql index database-design
假设 Postgres 10.X 中有 2 个示例表:
CREATE TABLE public.order (
id VARCHAR(36) NOT NULL,
...
)
CREATE TABLE public.suborder (
id VARCHAR(36) NOT NULL,
order_id VARCHAR(36) NOT NULL,
...
CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES public.order(id)
)
Run Code Online (Sandbox Code Playgroud)
所有 ID 都是简单的 UUID。经常suborder
被查询。即使它引用唯一(UUID)值,order_id
创建单独的索引是否有意义?order_id
就像是:
CREATE INDEX suborder_order_idx ON public.suborder(order_id)
Run Code Online (Sandbox Code Playgroud)
通常建议在外键列上建立索引。当主表和明细表频繁连接或主表上发生删除/更新时,它会有所帮助。在这种情况下,缺少索引会导致对详细表进行全面扫描以强制执行外键。
如果您的系统符合上述任一条件,那么添加索引将是一个好主意。
边注。您提到 ids 存储 guid 值,因此您可能从不按范围搜索。那么与“普通”b 树索引相比,哈希索引将是更好的选择。
如果父表接收到删除(或 PK 上的更新),则对外键列建立索引也很有用。对于父表中被删除的每一行,数据库必须检查引用表是否仍有引用父表的行。where
该检查是通过在 FK 列上使用条件从子表中进行选择来完成的。显然,如果对 FK 列建立索引,速度会更快(对于 Firebird、Oracle、SQL Server 或 DB2 等其他 DBMS 也是如此)