搜索数组性能?

sim*_*imo 6 postgresql performance array

我们有一张桌子

id|school_id|parent_ids
Run Code Online (Sandbox Code Playgroud)

其中parent_ids是 id 数组。

如果我们没有school_idand onlyparent_id来搜索,那么查询将搜索数组中的所有表行parent_ids,可能有数千行,并且parent_id实际上可能只在其中的几行中。

在这种情况下,在查询数组列时使用 IN 是否会成为性能障碍?

编辑

这是表结构的转储:

-- ----------------------------
-- Table structure for schools_messages
-- ----------------------------
DROP TABLE IF EXISTS "public"."schools_messages";
CREATE TABLE "public"."schools_messages" (
  "id" int4 NOT NULL DEFAULT nextval('schools_messages_id_seq'::regclass),
  "message" jsonb NOT NULL DEFAULT '[]'::jsonb,
  "details" jsonb NOT NULL DEFAULT '[]'::jsonb,
  "school_id" int4 NOT NULL,
  "created_at" timestamp(0),
  "updated_at" timestamp(0),
  "parents_ids" int4[] DEFAULT ARRAY[]::integer[]
)
;
ALTER TABLE "public"."schools_messages" OWNER TO "prod_schools";

-- ----------------------------
-- Primary Key structure for table schools_messages
-- ----------------------------
ALTER TABLE "public"."schools_messages" ADD CONSTRAINT "schools_messages_pkey" PRIMARY KEY ("id");

-- ----------------------------
-- Foreign Keys structure for table schools_messages
-- ----------------------------
ALTER TABLE "public"."schools_messages" ADD CONSTRAINT "schools_messages_school_id_foreign" FOREIGN KEY ("school_id") REFERENCES "public"."trk_schools" ("id") ON DELETE CASCADE ON UPDATE NO ACTION;
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 2

我同意杰克的观点,你的模式需要帮助。但你仍然可以这样做。在这里,我们使用两个核心扩展通过一个索引查找来完成此intarray操作btree_gist

CREATE EXTENSION intarray;
CREATE EXTENSION btree_gist;

CREATE INDEX ON public.schools_messages
  USING gist(school_id, parents_ids gist__int_ops);

VACUUM ANALYZE public.schools_messages;

SELECT *
FROM public.schools_messages
WHERE school_id = 42
  OR parent_id @> ARRAY[42];
Run Code Online (Sandbox Code Playgroud)

  • @simo我认为你需要问另一个问题并用 [tag:database-design] =) 标记它 (3认同)