We have a table containing around 500k rows. The database table is supposed to grow to million of records. This is how the table looks like: 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) ) And these are some of the queries we need to perform efficiently: SELECT "public"."influencers".* FROM "public"."influencers" WHERE (ig->'follower_count' IS NOT NULL) ORDER BY (ig->'follower_count') DESC LIMIT 9 OFFSET 0 SELECT * FROM "public"."influencers" WHERE (ig->'follower_count' >= '5000') LIMIT 9 SELECT SUM(CAST(ig ->> 'follower_count' AS integer)) FROM "public"."influencers" WHERE (ig->'follower_count' >= '5000') AND (ig->'follower_count' <= '10000') AND (ig->'follower_count' IS NOT NULL) `ig -> follower_count` are numeric values. I read that GIN indexes are mainly intended for searching through composite items (text) so I'm guessing the best index to use would be a BTREE. Would that be correct?