PostgreSQL:n suorituskyky ja kyselyjen optimointi · Oppitunti

Hash-, GIN- ja GiST-indeksit

Ymmärrä hash-, GIN- ja GiST-indeksien käyttötapaukset ja hyödyt tietyille tietotyypeille ja kyselymalleille.

Oppitunti 1/411 vaihetta

Hash-, GIN- ja GiST-indeksit on ilmainen PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PostgreSQL:n suorituskyky ja kyselyjen optimointi-kurssilla on yhteensä 4 oppituntia.

B-Tree-indeksien perusteita pidemmälle

Olette todennäköisesti tutustuneet B-Tree-indekseihin, jotka sopivat erinomaisesti yhden sarakkeen täsmähakuihin ja aluehakuihin. Entä monimutkaisemmat tietotyypit tai yksilölliset kyselytarpeet?

PostgreSQL tarjoaa erityisiä indeksityyppejä, jotka tehostavat juuri näitä tilanteita ja mahdollistavat tehokkaan kyselyn silloin, kun B-Tree-indeksit eivät riitä.

Hajautusindeksit yhtäsuuruushakuihin

Hajautusindeksi tallentaa hajautusarvon jokaisesta indeksoidusta sarakkeesta. Se on optimoitu erittäin nopeisiin yhtäsuuruushakuihin (joissa käytetään =-operaattoria).

  • Ajatelkaa sitä sanakirjahakuna: se on erittäin nopea, kun täsmällinen avain tunnetaan.
  • Ne voivat olla B-Tree-indeksejä nopeampia yksinkertaisissa yhtäsuuruustarkistuksissa erittäin suurissa tauluissa, etenkin kun samoja arvoja esiintyy paljon.

Hajautusindeksien rajoitukset

Vaikka hajautusindeksit ovat nopeita yhtäsuuruushauissa, niillä on merkittäviä rajoituksia:

  • Ei aluehakuja: Niitä ei voi käyttää >-, <- tai BETWEEN-kyselyihin.
  • Ei lajittelua: Ne eivät tallenna tietoja mihinkään tiettyyn järjestykseen, joten ne eivät voi auttaa ORDER BY-lausekkeissa.
  • Suojaus kaatumisia vastaan: Historiallisesti ne eivät olleet kaatumisenkestäviä. Vaikka tuki on parantunut uusissa PostgreSQL-versioissa, B-Tree-indeksejä suositaan edelleen yleensä kriittisissä tiedoissa niiden vankkuuden vuoksi.

GIN-indeksit: yleinen käänteishakemisto

GIN on lyhenne sanoista General Inverted Index eli yleinen käänteishakemisto. Se on suunniteltu tietotyypeille, jotka sisältävät useita yksittäisiä arvoja, kuten taulukoille, JSONB-asiakirjoille tai kokotekstihaun lekseemeille.

Ajatelkaa sitä kentän sisällön indeksointina, ei pelkästään itse kentän indeksointina. Näin näiden monimutkaisten rakenteiden sisällä olevat elementit voidaan hakea erittäin nopeasti esimerkiksi @>-operaattorilla (sisältää).

GIN-esimerkki: taulukkotiedot

Seuraavaksi näette, miten GIN-indeksi auttaa tekemään kyselyn taulukkosarakkeesta. Luomme taulun, lisäämme siihen tietoja, lisäämme GIN-indeksin ja teemme sitten kyselyn.

Huomatkaa @>-operaattori, jolla tarkistetaan, sisältääkö taulukko tietyt elementit.

CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  tags TEXT[]
);

INSERT INTO products (name, tags) VALUES
('Laptop', '{"electronics", "gadget"}'),
('Desk Chair', '{"furniture", "office"}'),
('Monitor', '{"electronics", "display", "office"}');

CREATE INDEX idx_products_tags ON products USING GIN (tags);

SELECT name FROM products WHERE tags @> '{"electronics"}';

GiST-indeksit: yleistetty hakupuu

GiST on lyhenne sanoista Generalized Search Tree eli yleistetty hakupuu. Se on erittäin joustava indeksirakenne, joka pystyy käsittelemään monenlaisia kyselyitä, erityisesti kyselyitä, joissa käytetään epästandardeja tietotyyppejä tai monimutkaisia operaattoreita.

Keskeisiä käyttötapauksia ovat:

  • Paikkatiedot: esimerkiksi pisteiden etsiminen monikulmion sisältä tai päällekkäisten objektien etsiminen.
  • Aluetyypit: esimerkiksi päällekkäisten ajanjaksojen tai numeeristen alueiden etsiminen.
  • Kokotekstihaku: GIN on kuitenkin usein tätä nopeampi.

GiST-esimerkki: paikkatiedot

Tässä on esimerkki GiST:n käytöstä PostgreSQL:n sisäänrakennetun box-tyypin kanssa tietyn suorakulmaisen alueen sisällä olevien objektien etsimiseen. Käytämme &&-operaattoria päällekkäisyyden tarkistamiseen.

CREATE TABLE locations (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  area BOX
);

INSERT INTO locations (name, area) VALUES
('Park A', '((0,0),(10,10))'),
('Building B', '((5,5),(15,15))'),
('River C', '((12,1),(18,8))');

CREATE INDEX idx_locations_area ON locations USING GiST (area);

SELECT name FROM locations WHERE area && '((7,7),(12,12))';

GIN vai GiST kokotekstihakuun

Sekä GIN- että GiST-indeksejä voidaan käyttää PostgreSQL:n kokotekstihakuun (FTS), mutta niiden vahvuudet ovat erilaiset:

  • GIN: Yleensä nopeampi hauissa, kun hakutermin sisältäviä kohteita on paljon, ja myös indeksin ensimmäinen muodostaminen on nopeampaa.
  • GiST: Voi olla päivityksissä nopeampi, jos tiedot muuttuvat usein, sillä GIN-indeksin päivittäminen voi olla hitaampaa. GiST tukee myös useampia FTS-operaattoreita.

Useimmissa lukupainotteisissa FTS-tilanteissa GIN on ensisijainen valinta.

Sopivan indeksin valinta

Tässä on lyhyt opas valintaa varten:

  • B-Tree: Oletusarvoinen yleisindeksi. Sopii yhtäsuuruushakuihin, aluehakuihin ja lajitteluun.
  • Hash: Vain täsmälliseen yhtäsuuruushakuun (=); ei aluehakuja eikä lajittelua. Rajoitustensa vuoksi harvinaisempi.
  • GIN: Käänteisesti indeksoitaville tiedoille, kuten taulukoille, JSONB:lle ja kokotekstihaulle. Löytää tehokkaasti monimutkaisten tyyppien sisällä olevat elementit.
  • GiST: Erittäin joustava; sopii paikkatiedoille (pisteet, laatikot), aluetyypeille ja joskus kokotekstihakuun. Hyvä valinta monimutkaisille operaattoreille.

Indeksityyppihaaste

Teillä on events-taulu, jossa on tags JSONB -sarake, ja teette usein kyselyitä tapahtumista, jotka sisältävät tiettyjä tunnisteita @>-operaattorilla (esimerkiksi WHERE tags @> '{"urgent"}').

Mikä indeksityyppi tarjoaisi parhaan suorituskyvyn juuri tällaiselle kyselylle?

Kertaus: erityiset indeksit

Hienoa! Olette tutustuneet PostgreSQL:n edistyneisiin indeksityyppeihin:

  • Hajautusindeksit nopeisiin yhtäsuuruustarkistuksiin (rajoituksineen).
  • GIN-indeksit monimutkaisten tietojen, kuten taulukoiden ja JSONB:n, sisältämien elementtien tehokkaaseen hakemiseen.
  • GiST-indeksit paikkatietojen, aluetyyppien ja monimutkaisten operaattoreiden joustavaan indeksointiin.

Näiden erityisten indeksien avulla voitte optimoida kyselyitä, joita B-Tree-indeksit eivät pysty käsittelemään tehokkaasti. Seuraavalla oppitunnilla tutustutte osittaisiin ja lausekeindekseihin!

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
22
Oppitunnit
88

Usein kysytyt kysymykset

Onko oppitunti ”Hash-, GIN- ja GiST-indeksit” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppimispolun 3 oppituntia, myös oppitunnin “Hash-, GIN- ja GiST-indeksit”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. PostgreSQL:n suorituskyky ja kyselyjen optimointi-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Hash-, GIN- ja GiST-indeksit”?

Ymmärrä hash-, GIN- ja GiST-indeksien käyttötapaukset ja hyödyt tietyille tietotyypeille ja kyselymalleille. Harjoittelet PostgreSQL:n suorituskyky ja kyselyjen optimointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni PostgreSQL:n suorituskyky ja kyselyjen optimointi-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Hash-, GIN- ja GiST-indeksit”-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ä PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppitunnilla?

Kyllä. Jokainen PostgreSQL:n suorituskyky ja kyselyjen optimointi-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. Hash-, GIN- ja GiST-indeksit
  2. Osittaiset indeksit ja lausekeindeksit
  3. Peittävät indeksit ja pelkät indeksiskannaukset
  4. BRIN-indeksit suurille peräkkäisille tietomäärille
← Takaisin: PostgreSQL:n suorituskyky ja kyselyjen optimointi