Skip to content

Paga-index sa SQL ipinaliwanag

Isang cheatsheet tungkol sa mga uri ng SQL index, mga pattern ng disenyo, at pagpapanatili.

Nagpapalit ang mga index ng storage at bilis ng pagsulat para sa bilis ng pagbasa. Piliin ang istruktura, takdaan ang saklaw ng mga row, at pangalagaan ang bloat.

Talaan ng sanggunian · 31 mga entry
31 of 31 rows
Mga uri ng index
Balanseng puno para sa equality, range, at nakaayos na scan. Default sa karamihan ng database.Gamitin para sa =, <, >, BETWEEN, ORDER BY. Huwag para sa full-text search.
Index na ang leaf level ay ang table mismo. Nakaimbak ang mga row ayon sa pagkakasunod-sunod ng key. Isa kada table.Nag-cluster ang InnoDB sa primary key. Ang mga SQL Server table na wala nito ay heaps.
Hiwalay na istrukturang may mga key at pointer pabalik sa base table. Marami kada table.Sa heap, nag-iimbak ito ng row ID. Sa clustered table, nag-iimbak ito ng clustering key.
Hash table para sa equality lookup lamang. Eksaktong tugma sa constant na oras.Gamitin lamang para sa mga operasyong = ; kailangan ng range at pagkuha ng B-tree. Ang memory-optimized hash ng SQL Server ay nangangailangan ng bucket count na malapit sa bilang ng row.
Generalized Inverted Index. Minamapa ang mga value papunta sa mga row. Ginawa para sa mga array at full-text.Gamitin para sa jsonb, mga array, tsvector, at trigram search. Mas mabagal gawin kaysa B-tree.
Generalized Search Tree. Napapalawak para sa mga non-scalar na uri at overlap query.Gamitin para sa geometric range, kNN, at exclusion constraint. Pinapabilis ng pg_trgm ang LIKE.
Space-partitioned GiST. Hinihiwa ang data sa mga hindi magkadungong rehiyon sa pamamagitan ng radix o quad tree.Gamitin para sa mga punto, prefix ng IP, at pagtutugma ng prefix. Hindi para sa overlap query; gamitin ang GiST.
Block Range Index. Nag-iimbak ng min/max kada block range. Napakaliit na footprint.Gamitin sa malalaki at pisikal na nakaayos na table. Mura gawin, mahinang selectivity.
Index na nakaimbak bilang segment ng column sa halip na row. Mataas na compression, pagpapatupad nang maramihan.Gamitin sa analytical scan sa maraming row at iilang column. Mabagal ang lookup na isang row lamang.
Nakalaing inverted word index sa MySQL at SQL Server. Ginagawa kada text column.Gamitin ang MATCH AGAINST o CONTAINS. Ginagamit ng Postgres full-text ang GIN sa tsvector sa halip.
Index ng Oracle na may isang bitmap kada natatanging value. Minamarkahan ng bawat bit ang isang row.Gamitin sa low-cardinality na column sa read-heavy na warehouse. Nagse-serialize ang sabay-sabay na pagsulat kada bitmap.
Index column na idineklarang DESC. Nakaimbak ang mga key ng column na iyon sa kabaligtaran na pagkakasunod-sunod.Kailangan para sa halo-halong sort tulad ng (a ASC, b DESC). Kayang basahin ng payak na DESC sort ang ordinaryong index nang pabaliktad.
Index ng MySQL 8 na binabalewala ng optimizer. Pinapanatili pa rin ito sa bawat pagsulat.Itago ang index bago i-drop upang subukan ang epekto. Gawing visible muli nang walang rebuild.
Disenyo
Index na maramihang column. Dapat tumugma ang mga nangungunang column sa pagkakasunod-sunod ng filter ng query.Iayos ayon sa equality muna, saka range. Hindi mapapalitan ng dalawang solong index ang isang composite.
Index sa isang WHERE predicate. filtered index ang tawag ng SQL Server dito. Sakop lamang nito ang mga tumutugmang row.I-index lamang ang mga row na active='t'. Hinahati sa dalawa ang laki at gastos sa pagsulat.
B-tree na may karagdagang mga non-key na column. Iniiwasan ng index-only scan ang paghahanap sa heap.Idagdag ang mga column na madalas kunin sa pamamagitan ng INCLUDE. Mananatiling napapasorted ang index.
Index na nagpapatupad ng walang duplicate na value. Tinatanggihan ang mga insert na nagbabanggaan.Gamitin para sa natural key at one-to-one constraint. Pinapayagan ng UNIQUE NULL ang maraming NULL.
Index na nakabuo sa function ng mga column sa halip na sa mismong mga column.I-index ang lower(email) o date_trunc('day', created_at). Dapat ulitin ng query ang eksaktong expression.
Operator class. Nagtatakda kung paano nagkokumpara at nag-iimbak ang index sa uri ng isang column.Itakda ang varchar_pattern_ops para sa LIKE 'abc%' nang walang pagbabago ng case. Ang mga default ay angkop sa equality at range.
Plan na sumasagot sa query mula sa mga pahina ng index lamang. Hindi kailanman nababasa ang heap.Kailangang nasa index o INCLUDE list ang bawat kinukuhang column. Pinapanatili ng Vacuum na napapanahon ang visibility map.
Walang automatikong index na natatanggap ang mga foreign key column sa tumutukoy na table.I-index ang bawat FK column na dinadaanan mo sa join o delete. Nagse-scan ang cascade delete sa child table nang wala ito.
Pagpapanatili
Tagasuri ng plan. Nagpapakita ng sequential scan, pagpili ng index, at tantya ng gastos.Gamitin ang EXPLAIN (ANALYZE, BUFFERS). Ang Seq Scan sa table na 10M ang row ay tanda ng kulang na index.
Kumukuha ng sample sa mga column ng table para bumuo ng planner statistics. Ang mga histogram ang nagtutulak sa pagpili ng index.Patakbuhin pagkatapos ng bulk load. Ang lumang estadistika ay nagdudulot ng seq scan sa mga naka-index na column.
Dagdag gastos sa pagsulat ang bawat index. Bayad ang insert, update, at delete kada index.I-drop ang mga hindi nagagamit na index. Subaybayan ang paggamit sa pg_stat_user_indexes.
View ng Postgres para sa paggamit kada index. Bumibilang ng scan at nabasang tuple mula noong na-reset ang estadistika.Salaan ang idx_scan = 0 para makahanap ng mga hindi nagagamit na index. I-reset ang mga counter gamit ang pg_stat_reset().
Bumubuo ng index nang hindi hinaharang ang pagbasa o pagsulat. Nangangailangan ng dalawang scan ng table.Hindi maaaring patakbuhin sa loob ng transaksyon. Ang bigong build ay nag-iiwan ng INVALID na index na dapat i-drop.
Nag-aalis ng index at pinapalaya ang storage nito. Humahawak ng exclusive lock bilang default.Gamitin ang DROP INDEX CONCURRENTLY sa mga abalang table. Tingnan ang estadistika ng paggamit bago alisin.
Muling binubuo ang namamagang index. Nabubawi ang espasyo mula sa mga patay na tuple.Gamitin ang REINDEX CONCURRENTLY sa production. Humaharang sa pagsulat ang mga lock nang wala ito.
Mga patay na tuple at patlang sa pahina na dumarami sa mga MVCC table at sa mga index nito.Sukatin gamit ang pgstattuple. Madalas na Vacuum; REINDEX kapag nanaig ang patay na espasyo.
Porsyento ng pahina na puno sa oras ng pagsulat. Ang libreng espasyo ay sumisipsip ng mga susunod na update.Ibaba sa 70-90 sa mga table na madalas mainit na i-update. Napipilitan ang mga punong pahina sa page split.
Muling sinusulat ang table nang pisikal na nakaayos ayon sa isang index. Isang beses na operasyon.Magkasama sa BRIN para sa mga nakaayos na block. Hindi mapapanatili ang ayos sa mga susunod na pagsulat.