【发布时间】:2020-05-24 11:14:41
【问题描述】:
我有一个关于Postgres中索引优化的问题,我在网上没有找到太多帮助,我一直在努力通过测试自己得到答案。
我有这张桌子
CREATE TABLE "public"."crawls" (
"id" uuid NOT NULL DEFAULT uuid_generate_v4(),
"parent_id" uuid,
"group_id" timestamp,
"url" varchar(2083) NOT NULL,
"done" boolean;
PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "parentid_groupid_url" ON "public"."urls" USING BTREE ("parent_id","group_id","url");
这是一个 URL 存储,用于计算每个父级和每个组唯一的 URL 的完整列表。我只需要在这个索引上完全匹配。 这意味着只要 group_id 不同,parent_id 就可以多次同时具有相同的 URL。
该表包含数亿个URL,主要用于写入,UNIQUE索引用于去重。
UPDATE crawls
SET
done = TRUE
WHERE
url = $1 AND
parent_id = $2 AND
group_id = $3
INSERT
INTO crawls (
url,
parent_id,
group_id
) VALUES
('long urls', uuid, date)
ON CONFLICT parentid_groupid_url DO NOTHING
目前性能还可以,但可能会更好,并且由于 url 列,索引大小大于表本身。
我想知道如何改进尺寸和/或性能? (如果可能,两个)
我考虑过使用一个新列对 URL 进行散列 (md5, sha1) 并在索引中使用它而不是 URL,以便长度一致、更小并且对于 Postgres 可能更快,但我没有找到任何帮助。 由于哈希的“随机性”,我不确定它是否有效,并且由于在我的产品上构建索引的大小和时间,我很难测试这个假设。
我在网上找到的参考资料:
谢谢,
【问题讨论】:
-
什么是是 parent_id ?也许
REFERENCING (public.crawls.id)? (自我参考) -
这是一个外部引用,它在真实数据库中没有被命名为喜欢它,但我想简化问题的架构(我失败了啊啊)。
标签: database postgresql indexing database-performance