JSONB:n indeksointi GIN-indekseillä
Luo GIN-indeksejä JSONB-dokumenteille ja käytä jsonb_path_opsia sisältämiskyselyiden nopeuttamiseen.
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 tsGIN: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?
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
- JSONB vai JSON: milloin kumpaakin käytetään
- Polkuoperaattorit: -> ->> @>
- JSONB:n indeksointi GIN-indekseillä
- Tietomallinnus: milloin JSONB voittaa normalisoinnin