Skip to content

SQL indexelés elmagyarázva

Gyorsreferencia az SQL indextípusokról, tervezési mintákról és karbantartásról.

Az index tárolási helyet és írási sebességet áldoz olvasási sebességért. Válaszd ki a struktúrát, korlátozd a sorok körét, és kezeld a bloatot.

Referenciatáblázat · 31 bejegyzés
31 of 31 rows
Indextípusok
Kiegyensúlyozott fa egyenlőség-, tartomány- és rendezett vizsgálatokhoz. A legtöbb adatbázisban alapértelmezett.Használd =, <, >, BETWEEN, ORDER BY esetén. Hagyd ki full-text kereséshez.
Olyan index, amelynek levélszintje maga a tábla. A sorok kulcssorrendben tárolódnak. Táblánként egy.Az InnoDB a primer kulcsra klaszterez. Az ezek nélküli SQL Server táblák heap-ek.
Külön struktúra, amely kulcsokat és egy, az alaptáblára mutató pointert tartalmaz. Táblánként sok.Heap esetén row ID-t tárol. Clustered táblán a klaszterező kulcsot tárolja.
Hash tábla kizárólag egyenlőség-keresésekhez. Állandó idejű pontos egyezés.Csak = műveletekhez használd; tartományhoz és rendezéshez B-tree kell. Az SQL Server memory-optimized hashéhez a sorszámhoz közeli bucket count kell.
Generalized Inverted Index. Értékeket rendel sorokhoz. Tömbökhöz és full-texthez készült.Használd jsonb, tömbök, tsvector, trigram kereséshez. Lassabban épül, mint a B-tree.
Generalized Search Tree. Nem skalár típusokhoz és átfedés-lekérdezésekhez bővíthető.Használd geometriai tartományokhoz, kNN-hez, kizárási megszorításokhoz. A pg_trgm gyorsítja a LIKE-ot.
Térbelisen particionált GiST. Radix- vagy quad-fákkal nem átfedő régiókra osztja az adatokat.Használd pontokhoz, IP-prefixumokhoz és előtag-egyeztetéshez. Átfedés-lekérdezéshez nem; arra a GiST való.
Block Range Index. Blokk-tartományonként min/max-ot tárol. Parányi helyigény.Nagy, fizikailag rendezett táblákon használd. Olcsó felépíteni, gyenge szelektivitás.
Oszlopszegmensekként tárolt index sorok helyett. Erős tömörítés, batch végrehajtás.Sok soros, kevés oszlopos analitikai vizsgálatokhoz használd. Az egyetlen soros keresések lassúak.
Dedikált invertált szóindex a MySQL-ben és az SQL Serverben. Szöveges oszloponként épül.Használd MATCH AGAINST vagy CONTAINS. A Postgres full-text helyette GIN-t használ tsvectoron.
Oracle index, amely distinct értékenként egy bitmappát tárol. Minden bit egy sort jelöl.Alacsony kardinalitású oszlopokon használd olvasásintenzív raktárakban. Az egyidejű írások bitmappánként szerializálódnak.
DESC-ként deklarált indexoszlop. Az adott oszlop kulcsai fordított sorrendben tárolódnak.Vegyes rendezésekhez kell, mint (a ASC, b DESC). A sima DESC rendezések a normál indexet visszafelé is ki tudják olvasni.
MySQL 8 index, amelyet az optimalizáló figyelmen kívül hagy. Minden íráskor továbbra is karban tartott.Rejtsd el az indexet eldobás előtt, hogy felmérd a hatását. Tedd újra láthatóvá újraépítés nélkül.
Tervezés
Több oszlopos index. A vezető oszlopoknak meg kell egyezniük a lekérdezés szűrési sorrendjével.Rendezd először egyenlőség, majd tartomány szerint. Két egyetlen oszlopos index nem pótol egy összetett indexet.
WHERE predikátumon épített index. Az SQL Server filtered indexnek hívja. Csak az egyező sorokat fedi.Indexeld csak az active='t' sorokat. Felére csökkenti a méretet és az írási költséget.
Extra, nem kulcs oszlopokkal bővített B-tree. Az index-only scan elkerüli a heap-keresést.Add hozzá a gyakran lekért oszlopokat INCLUDE-lal. Az index rendezhető marad.
Index, amely kikényszeríti a duplikátumok hiányát. Elutasítja az ütköző beszúrásokat.Természetes kulcsokhoz és egy-az-egyhez megszorításokhoz használd. A UNIQUE NULL sok NULL-t megenged.
Az oszlopok függvényén, nem magán az oszlopokon épített index.Indexeld a lower(email) vagy date_trunc('day', created_at) kifejezést. A lekérdezésnek pontosan ugyanezt a kifejezést kell használnia.
Operátorosztály. Meghatározza, hogyan hasonlít össze és tárol egy index egy oszlop típusát.Állíts be varchar_pattern_ops-t a LIKE 'abc%'hez kis-/nagybetű-egységesítés nélkül. Az alapértékek egyenlőségre és tartományra valók.
Terv, amely csak az index oldalakból válaszolja meg a lekérdezést. A heap sosem kerül olvasásra.Minden lekért oszlopnak az indexben vagy az INCLUDE listában kell lennie. A Vacuum naprakészen tartja a visibility mapet.
Az idegenkulcs-oszlopok nem kapnak automatikus indexet a hivatkozó táblán.Indexeld minden FK oszlopot, amelyen joinolsz vagy törölsz. A kaszkádolt törlések index nélkül végigvizsgálják a gyerektáblát.
Karbantartás
Tervvizsgáló. Szekvenciális vizsgálatokat, indexválasztásokat, költségbecsléseket mutat.Használd az EXPLAIN (ANALYZE, BUFFERS) alakot. A Seq Scan egy 10M soros táblán hiányzó indexet jelent.
Mintavételezi a tábla oszlopait, és planner-statisztikát épít. A hisztogramok irányítják az indexválasztást.Futtatás tömeges betöltés után. Az elavult statisztikák seq scannt okoznak indexelt oszlopokon.
Minden index írási többletköltséget ad. Az insert, update, delete indexenként fizet.Dobd el a nem használt indexeket. Kövesd a használatot a pg_stat_user_indexes-ben.
Postgres nézet indexenkénti használatról. A statisztika-nullázás óta számolja a vizsgálatokat és olvasott tuple-öket.Szűrj idx_scan = 0-ra a nem használt indexek megtalálásához. Nullázd a számlálókat pg_stat_reset()-tel.
Olyan indexet épít, amely nem blokkolja az olvasást és az írást. Két táblavizsgálat kell hozzá.Nem futtatható tranzakcióban. A sikertelen építés INVALID indexet hagy, amelyet el kell dobni.
Eltávolít egy indexet, és felszabadítja a tárolóját. Alapértelmezésben exkluzív zárat vesz fel.Használj DROP INDEX CONCURRENTLY-t forgalmas táblákon. Ellenőrizd a használati statisztikát az eltávolítás előtt.
Újjáépíti a duzzadt indexet. Halott tuple-öktől visszanyer teret.Használj REINDEX CONCURRENTLY-t élesben. Enélkül a zárak blokkolják az írást.
Halott tuple-ök és laprések, amelyek az MVCC táblákban és indexeikben halmozódnak.Mérd pgstattuple-lal. Vacuum-olj gyakran; REINDEX-elj, amikor a halott tér dominál.
Az íráskor csomagolt lap százaléka. A szabad hely a későbbi update-eket fogadja.Csökkentsd 70-90-re hot-update táblákon. A teli lapok page splitet kényszerítenek.
Fizikailag index szerint rendezve írja újra a táblát. Egyszeri művelet.BRIN-nel párosítva rendezett blokkokat ad. A későbbi írások nem tartják fenn a sorrendet.