bor*_*gvo 3 postgresql database-design json
出于某种原因,Postgres 似乎没有使用我们创建的索引。这是我正在测试的查询:
SELECT "public"."influencers".*
FROM "public"."influencers"
WHERE (ig -> 'id' @> '"4878142508"')
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
运行后EXPLAIN
:
-> Seq Scan on influencers (cost=0.00..32800.14 rows=216 width=1110)
Run Code Online (Sandbox Code Playgroud)
这表明(如我所见)没有使用索引。
这是我们创建的数据库和索引:
CREATE TABLE public.influencers
(
id integer NOT NULL DEFAULT nextval('influencers_id_seq'::regclass),
location jsonb,
gender text COLLATE pg_catalog."default",
birthdate timestamp without time zone,
ig jsonb,
contact_info jsonb,
created_at timestamp without time zone DEFAULT now(),
updated_at timestamp without time zone DEFAULT now(),
categories text[] COLLATE pg_catalog."default",
search_field text COLLATE pg_catalog."default",
search_vector tsvector,
ig_updated_at timestamp without time zone,
CONSTRAINT influencers_pkey PRIMARY KEY (id),
CONSTRAINT ig_id_must_exist CHECK (ig ? 'id'::text),
CONSTRAINT ig_username_must_exist CHECK (ig ? 'username'::text)
)
Run Code Online (Sandbox Code Playgroud)
以及创建的索引(首先是相关索引 - 我认为应该使用的索引):
CREATE INDEX idx_btree_ig_id
ON public.influencers USING btree
((ig ->> 'id'::text) COLLATE pg_catalog."default")
TABLESPACE pg_default;
CREATE INDEX ads_search_idx
ON public.influencers USING gin
(search_vector)
TABLESPACE pg_default;
CREATE INDEX ig_last_post_location_aal1
ON public.influencers USING btree
(((ig -> 'last_post_location'::text) -> 'administrative_area_level_1_id'::text))
TABLESPACE pg_default;
CREATE INDEX ig_last_post_location_aal2
ON public.influencers USING btree
(((ig -> 'last_post_location'::text) -> 'administrative_area_level_2_id'::text))
TABLESPACE pg_default;
CREATE INDEX ig_last_post_location_aal3
ON public.influencers USING btree
(((ig -> 'last_post_location'::text) -> 'administrative_area_level_3_id'::text))
TABLESPACE pg_default;
CREATE INDEX ig_last_post_location_country
ON public.influencers USING btree
(((ig -> 'last_post_location'::text) -> 'country_id'::text))
TABLESPACE pg_default;
CREATE INDEX ig_last_post_location_locality
ON public.influencers USING btree
(((ig -> 'last_post_location'::text) -> 'locality_id'::text))
TABLESPACE pg_default;
CREATE UNIQUE INDEX ig_unique_id
ON public.influencers USING btree
((ig ->> 'id'::text) COLLATE pg_catalog."default")
TABLESPACE pg_default;
CREATE TRIGGER influencers_search_vector_update
BEFORE INSERT OR UPDATE
ON public.influencers
FOR EACH ROW
EXECUTE PROCEDURE tsvector_update_trigger(s, e, a, r, c, h, _, v, e, c, t, o, r, \, 0, 0, 0, p, g, _, c, a, t, a, l, o, g, ., s, i, m, p, l, e, \, 0, 0, 0, s, e, a, r, c, h, _, f, i, e, l, d, \, 0, 0, 0);
CREATE TRIGGER update_search_field_influencers_on_insert
BEFORE INSERT
ON public.influencers
FOR EACH ROW
EXECUTE PROCEDURE update_influencer_search_field();
CREATE TRIGGER update_search_field_influencers_on_update
BEFORE UPDATE
ON public.influencers
FOR EACH ROW
EXECUTE PROCEDURE update_influencer_search_field();
Run Code Online (Sandbox Code Playgroud)
怎么了?
指数idx_btree_ig_id
会,如果你写的前提下使用WHERE
状部分ig ->> 'id' = '"4878142508"'
。(我假设ig
具有类似的结构{"id": "4878142508", ...}
)
如果要使用运算符@>
,则需要在该列上创建gin 索引,然后可以像这样使用此索引:ig @> '{"id":"4878142508"}'
CREATE INDEX idx_gin_ig_id ON public.influencers USING gin (ig jsonb_path_ops);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1893 次 |
最近记录: |