SQL Academy · Oppitunti

JSONB:n indeksointi GIN-indekseillä

Luo GIN-indeksejä JSONB-dokumenteille ja käytä jsonb_path_opsia sisältämiskyselyiden nopeuttamiseen.

Oppitunti 3/413 vaihetta

JSONB:n indeksointi GIN-indekseillä on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Miksi JSONB:lle käytetään GIN:ää

JSONB-asiakirjoissa on paljon "alkioita" (avain–arvo-pareja ja taulukkoalkioita). GIN (Generalised Inverted Index) on suunniteltu kyselyihin, joissa etsitään "rivejä, joiden asiakirja sisältää X:n".

Oletusarvoinen GIN-indeksi

Oletusoperaattoriluokka tukee operaattoreita @>, ?, ?| ja ?&:

CREATE INDEX events_data_gin ON events USING GIN (data);

-- These now use the index:
SELECT * FROM events WHERE data @> '{"type":"login"}';
SELECT * FROM events WHERE data ? 'error';

jsonb_path_ops: pienempi ja nopeampi

Puolet pienempi ja nopeampi vain sisältämiseen perustuvissa kyselyissä, mutta tukee AINOASTAAN operaattoria @>:

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);

-- Supports @>
-- Does NOT support ?  ?|  ?&
SELECT * FROM events WHERE data @> '{"type":"login"}';

Indeksoikaa vain yksi polku

Jos kyselette vain yhtä avainta, poimitusta arvosta tehty lausekepohjainen B-tree-indeksi on vielä nopeampi:

CREATE INDEX events_user_id_idx
  ON events (((data->>'user_id')::BIGINT));

SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;

Taulukoiden sisällön indeksointi

Käyttäkää taulukkopolussa GIN-indeksiä:

CREATE INDEX events_tags_gin
  ON events USING GIN ((data->'tags'));

SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;

JSONB-indeksin yhdistäminen muihin suodattimiin

Yhdistelmäpredikaatit voivat käyttää GIN-indeksiä JSONB-osalle ja toista indeksiä muille kuin JSONB-ehdoille:

EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
  AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on ts

GIN:n kirjoitussuorituskyky

GIN-päivitykset ovat raskaampia kuin B-tree-päivitykset. Hyvin kirjoitusintensiivisissä tauluissa fastupdate-asetus eräyttää GIN-päivitykset VACUUM-toiminnon tyhjentämään odotuslistaan.

CREATE INDEX events_data_gin ON events USING GIN (data) WITH (fastupdate = on);

-- Flush manually if needed:
SELECT gin_clean_pending_list('events_data_gin');

Indeksin koko

JSONB:n GIN-indeksit voivat olla suuria. Erittäin suurissa tauluissa harkitkaa seuraavia vaihtoehtoja:

  • Indeksoikaa vain tietyt polut (lausekeindeksi)
  • Siirtykää jsonb_path_ops-operaattoriluokkaan, jos tarvitsette vain sisältämiseen perustuvia hakuja
  • Siirtäkää usein käytetyt kentät oikeisiin sarakkeisiin

Yhdistäminen trigrammi-indeksointiin

Jos tarvitsette epätarkkaa tekstihakua JSONB:n sisältä, poimikaa arvo TEXT-lausekkeeksi ja lisätkää pg_trgm-GIN-indeksi:

CREATE INDEX events_message_trgm
  ON events USING GIN ((data->>'message') gin_trgm_ops);

Milloin indeksointi ei auta

Jos suodatin koskee jokaista riviä (valikoivuus on erittäin pieni), suunnittelija saattaa valita peräkkäisen haun indeksistä huolimatta. Vahvistakaa asia komennolla EXPLAIN ANALYZE.

JSONB-indeksien ylläpito

GIN-indeksit paisuvat muiden indeksien tavoin. Käyttäkää säännöllisesti komentoa REINDEX CONCURRENTLY:

REINDEX INDEX CONCURRENTLY events_data_gin;

Kertaus

GIN muuttaa JSONB-suodattimet millisekunneissa valmistuviksi hauiksi.

  • Oletus-GIN: @>, ?, ?|, ?&
  • jsonb_path_ops: pienempi, vain sisältämiseen perustuville hauille
  • Poimitusta skalaarista tehty lausekepohjainen B-tree: nopein yhdelle avaimelle

Pikatarkistus

Teette JSONB-sarakkeesta aina vain data @> ... -kyselyitä. Mikä indeksi on pienikokoisin ja tarjoaa kaiken tarvittavan toiminnallisuuden?

Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”JSONB:n indeksointi GIN-indekseillä” ilmainen?

Kyllä – oppitunnin ”JSONB:n indeksointi GIN-indekseillä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”JSONB:n indeksointi GIN-indekseillä”?

Luo GIN-indeksejä JSONB-dokumenteille ja käytä jsonb_path_opsia sisältämiskyselyiden nopeuttamiseen. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”JSONB:n indeksointi GIN-indekseillä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. JSONB vai JSON: milloin kumpaakin käytetään
  2. Polkuoperaattorit: -> ->> @>
  3. JSONB:n indeksointi GIN-indekseillä
  4. Tietomallinnus: milloin JSONB voittaa normalisoinnin
← Takaisin: SQL Academy