Ag baint ĂșsĂĄide as na gnĂ©ithe innĂ©acsanna go lĂ©ir i PostgreSQL

Ag baint ĂșsĂĄide as na gnĂ©ithe innĂ©acsanna go lĂ©ir i PostgreSQL
I saol Postgres, tĂĄ innĂ©acsanna riachtanach chun stĂłrĂĄil an bhunachair sonraĂ­ a nascleanĂșint go hĂ©ifeachtĂșil (ar a dtugtar "carn"). NĂ­ thacaĂ­onn Postgres le braisliĂș dĂł, agus cuireann ailtireacht an MVCC faoi deara go mbĂ­onn go leor leaganacha den tuple cĂ©anna agat. DĂĄ bhrĂ­ sin, tĂĄ sĂ© an-tĂĄbhachtach a bheith in ann innĂ©acsanna Ă©ifeachtacha a chruthĂș agus a chothabhĂĄil chun tacĂș le hiarratais.

Seo roinnt leideanna chun ĂșsĂĄid innĂ©acsanna a bharrfheabhsĂș agus a fheabhsĂș.

Tabhair faoi deara: oibrĂ­onn na fiosruithe a thaispeĂĄntar thĂ­os ar neamhmhodhnĂș bunachar sonraĂ­ samplach.

Ag ÚsĂĄid InnĂ©acsanna ClĂșdaigh

BreathnaĂ­mid ar iarratas chun seoltaĂ­ rĂ­omhphoist a bhaint as ĂșsĂĄideoirĂ­ neamhghnĂ­omhacha. TĂĄbla customer tĂĄ colĂșn active, agus tĂĄ an cheist simplĂ­:

pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
                        QUERY PLAN
-----------------------------------------------------------
 Seq Scan on customer  (cost=0.00..16.49 rows=15 width=32)
   Filter: (active = 0)
(2 rows)

Baineann an cheist leis an seicheamh scanadh tĂĄbla iomlĂĄn customer. CruthaĂ­mid innĂ©acs ar cholĂșn active:

pagila=# CREATE INDEX idx_cust1 ON customer(active);
CREATE INDEX
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
                                 QUERY PLAN
-----------------------------------------------------------------------------
 Index Scan using idx_cust1 on customer  (cost=0.28..12.29 rows=15 width=32)
   Index Cond: (active = 0)
(2 rows)

Chuidigh sĂ©, d'iompaigh an scanadh ina dhiaidh sin isteach "index scan“. CiallaĂ­onn sĂ© seo go ndĂ©anfaidh Postgres an t-innĂ©acs a scanadh "idx_cust1" , agus ansin lean ar aghaidh ag cuardach an charn tĂĄbla chun luachanna na gcolĂșn eile a lĂ©amh (sa chĂĄs seo, an colĂșn email) a theastaĂ­onn Ăłn bhfiosrĂșchĂĄn.

Tugtar isteach innĂ©acsanna cumhdaigh in PostgreSQL 11 . Ligeann siad duit colĂșn breise amhĂĄin nĂł nĂ­os mĂł a chur san ĂĄireamh san innĂ©acs fĂ©in - stĂłrĂĄiltear a luachanna sa stĂłr sonraĂ­ innĂ©acs.

DĂĄ mbainfimid leas as an ngnĂ© seo agus mĂĄ chuireamar an luach rĂ­omhphoist laistigh den innĂ©acs, nĂ­ bheadh ​​​​gĂĄ le Postgres cuardach a dhĂ©anamh ar an gcarn tĂĄbla don luach. email. Feicfimid an n-oibreoidh sĂ© seo:

pagila=# CREATE INDEX idx_cust2 ON customer(active) INCLUDE (email);
CREATE INDEX
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
                                    QUERY PLAN
----------------------------------------------------------------------------------
 Index Only Scan using idx_cust2 on customer  (cost=0.28..12.29 rows=15 width=32)
   Index Cond: (active = 0)
(2 rows)

«Index Only Scan' a insĂ­onn dĂșinn nach bhfuil ag teastĂĄil Ăłn bhfiosrĂșchĂĄn anois ach innĂ©acs, rud a chabhraĂ­onn le gach diosca I/O a sheachaint chun an carn tĂĄbla a lĂ©amh.

NĂ­l innĂ©acsanna clĂșdaigh ar fĂĄil faoi lĂĄthair ach amhĂĄin do chrainn B. Mar sin fĂ©in, sa chĂĄs seo, beidh an iarracht chothabhĂĄla nĂ­os airde.

Ag ÚsĂĄid InnĂ©acsanna PĂĄirteach

NĂ­ innĂ©acsaĂ­onn innĂ©acsanna pĂĄirteacha ach fo-thacar de na sraitheanna i dtĂĄbla. SĂĄbhĂĄlann sĂ© seo mĂ©id na n-innĂ©acsanna agus dĂ©anann sĂ© scanadh nĂ­os tapĂșla.

Ligean le rå gur mhaith linn liosta de sheoltaí ríomhphoist år gcustaiméirí a fhåil i gCalifornia. Beidh an t-iarratas mar seo:

SELECT c.email FROM customer c
JOIN address a ON c.address_id = a.address_id
WHERE a.district = 'California';
which has a query plan that involves scanning both the tables that are joined:
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
                              QUERY PLAN
----------------------------------------------------------------------
 Hash Join  (cost=15.65..32.22 rows=9 width=32)
   Hash Cond: (c.address_id = a.address_id)
   ->  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)
   ->  Hash  (cost=15.54..15.54 rows=9 width=4)
         ->  Seq Scan on address a  (cost=0.00..15.54 rows=9 width=4)
               Filter: (district = 'California'::text)
(6 rows)

Cad a thabharfaidh gnĂĄth-innĂ©acsanna dĂșinn:

pagila=# CREATE INDEX idx_address1 ON address(district);
CREATE INDEX
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
                                      QUERY PLAN
---------------------------------------------------------------------------------------
 Hash Join  (cost=12.98..29.55 rows=9 width=32)
   Hash Cond: (c.address_id = a.address_id)
   ->  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)
   ->  Hash  (cost=12.87..12.87 rows=9 width=4)
         ->  Bitmap Heap Scan on address a  (cost=4.34..12.87 rows=9 width=4)
               Recheck Cond: (district = 'California'::text)
               ->  Bitmap Index Scan on idx_address1  (cost=0.00..4.34 rows=9 width=0)
                     Index Cond: (district = 'California'::text)
(8 rows)

Scan address Tå scanadh innéacs curtha ina ionad idx_address1agus ansin scanadh an gcarn address.

Ós rud Ă© gur ceist mhinic Ă© seo agus gur gĂĄ Ă© a bharrfheabhsĂș, is fĂ©idir linn innĂ©acs pĂĄirteach a ĂșsĂĄid, a dhĂ©anann innĂ©acsĂș ar na sraitheanna sin amhĂĄin le seoltaĂ­ ina bhfuil an ceantar. ‘California’:

pagila=# CREATE INDEX idx_address2 ON address(address_id) WHERE district='California';
CREATE INDEX
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
                                           QUERY PLAN
------------------------------------------------------------------------------------------------
 Hash Join  (cost=12.38..28.96 rows=9 width=32)
   Hash Cond: (c.address_id = a.address_id)
   ->  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)
   ->  Hash  (cost=12.27..12.27 rows=9 width=4)
         ->  Index Only Scan using idx_address2 on address a  (cost=0.14..12.27 rows=9 width=4)
(5 rows)

Anois ní léann ach an cheist idx_address2 agus nach dteagmhåil leis an tåbla address.

Ag baint ĂșsĂĄide as InnĂ©acsanna Illuacha

Seans nach mbeidh cineĂĄl sonraĂ­ scĂĄlach i roinnt colĂșin atĂĄ le hinnĂ©acsĂș. Is maith le cineĂĄlacha colĂșn jsonb, arrays Đž tsvector go bhfuil luachanna ilchodacha nĂł iolracha ann. MĂĄs gĂĄ duit colĂșin den sĂłrt sin a innĂ©acsĂș, de ghnĂĄth caithfidh tĂș cuardach a dhĂ©anamh trĂ­ na luachanna aonair go lĂ©ir sna colĂșin sin.

DĂ©anaimis iarracht teacht ar theidil na scannĂĄn go lĂ©ir ina bhfuil gearrthacha Ăł ghlactha nĂĄr Ă©irigh leo. TĂĄbla film tĂĄ colĂșn tĂ©acs ar a dtugtar special_features. MĂĄ tĂĄ an "airĂ­onna speisialta" seo ag an scannĂĄn, tĂĄ an eilimint mar eagar tĂ©acs sa cholĂșn Behind The Scenes. Chun cuardach a dhĂ©anamh ar gach scannĂĄn den sĂłrt sin, nĂ­ mĂłr dĂșinn gach sraith a roghnĂș le "Behind The Scenes" nuair aon luachanna eagar special_features:

SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}';

Oibreoir neadaithe @> seiceålacha må tå an taobh deas fo-thacar den taobh clé.

Plean iarratais:

pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
                           QUERY PLAN
-----------------------------------------------------------------
 Seq Scan on film  (cost=0.00..67.50 rows=5 width=15)
   Filter: (special_features @> '{"Behind The Scenes"}'::text[])
(2 rows)

A iarrann scanadh carn iomlĂĄn ar chostas 67.

Feicfimid an gcabhraíonn innéacs rialta crann B linn:

pagila=# CREATE INDEX idx_film1 ON film(special_features);
CREATE INDEX
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
                           QUERY PLAN
-----------------------------------------------------------------
 Seq Scan on film  (cost=0.00..67.50 rows=5 width=15)
   Filter: (special_features @> '{"Behind The Scenes"}'::text[])
(2 rows)

NĂ­or measadh an t-innĂ©acs fiĂș. NĂ­ heol don innĂ©acs B-crann go bhfuil gnĂ©ithe aonair sna luachanna innĂ©acsaithe.

Tå innéacs GIN de dhíth orainn.

pagila=# CREATE INDEX idx_film2 ON film USING GIN(special_features);
CREATE INDEX
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
                                QUERY PLAN
---------------------------------------------------------------------------
 Bitmap Heap Scan on film  (cost=8.04..23.58 rows=5 width=15)
   Recheck Cond: (special_features @> '{"Behind The Scenes"}'::text[])
   ->  Bitmap Index Scan on idx_film2  (cost=0.00..8.04 rows=5 width=0)
         Index Cond: (special_features @> '{"Behind The Scenes"}'::text[])
(4 rows)

TacaĂ­onn an t-innĂ©acs GIN le luachanna aonair a mhapĂĄil i gcoinne luachanna ilchodacha innĂ©acsaithe, rud a fhĂĄgann go bhfuil costas plean fiosrĂșchĂĄin nĂ­os mĂł nĂĄ leath.

FĂĄil rĂ©idh le hinnĂ©acsanna dĂșblacha

Carnann innĂ©acsanna le himeacht ama, agus uaireanta d’fhĂ©adfadh an sainmhĂ­niĂș cĂ©anna a bheith in innĂ©acs nua agus a bhĂ­ ar na cinn roimhe seo. Is fĂ©idir leat amharc na catalĂłige a ĂșsĂĄid chun sainmhĂ­nithe SQL atĂĄ inlĂ©ite ag daoine a fhĂĄil ar innĂ©acsanna. pg_indexes. Is fĂ©idir leat sainmhĂ­nithe comhionanna a fhĂĄil go hĂ©asca freisin:

 SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn
    FROM pg_indexes
GROUP BY defn
  HAVING count(*) > 1;
And here’s the result when run on the stock pagila database:
pagila=#   SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn
pagila-#     FROM pg_indexes
pagila-# GROUP BY defn
pagila-#   HAVING count(*) > 1;
                                indexes                                 |                                defn
------------------------------------------------------------------------+------------------------------------------------------------------
 {payment_p2017_01_customer_id_idx,idx_fk_payment_p2017_01_customer_id} | CREATE INDEX  ON public.payment_p2017_01 USING btree (customer_id
 {payment_p2017_02_customer_id_idx,idx_fk_payment_p2017_02_customer_id} | CREATE INDEX  ON public.payment_p2017_02 USING btree (customer_id
 {payment_p2017_03_customer_id_idx,idx_fk_payment_p2017_03_customer_id} | CREATE INDEX  ON public.payment_p2017_03 USING btree (customer_id
 {idx_fk_payment_p2017_04_customer_id,payment_p2017_04_customer_id_idx} | CREATE INDEX  ON public.payment_p2017_04 USING btree (customer_id
 {payment_p2017_05_customer_id_idx,idx_fk_payment_p2017_05_customer_id} | CREATE INDEX  ON public.payment_p2017_05 USING btree (customer_id
 {idx_fk_payment_p2017_06_customer_id,payment_p2017_06_customer_id_idx} | CREATE INDEX  ON public.payment_p2017_06 USING btree (customer_id
(6 rows)

Innéacsanna Sårshraith

Is fĂ©idir go dtarlĂłdh sĂ© go mbeidh go leor innĂ©acsanna agat, ceann acu a dhĂ©anann innĂ©acsĂș ar shĂĄrthacar de cholĂșin a dhĂ©anann innĂ©acsĂș ar innĂ©acsanna eile. D’fhĂ©adfadh nĂł nach mbeadh sĂ© seo inmhianaithe—d’fhĂ©adfadh scananna innĂ©acs-amhĂĄin a bheith mar thoradh ar an sĂĄr-thacar, rud atĂĄ go maith, ach d’fhĂ©adfadh go dtĂłgfadh sĂ© an iomarca spĂĄis, nĂł nĂ­ bhaintear ĂșsĂĄid a thuilleadh as an bhfiosrĂșchĂĄn a raibh sĂ© i gceist ag an sĂĄrshraith Ă© a bharrfheabhsĂș.

MĂĄs gĂĄ duit an sainmhĂ­niĂș ar innĂ©acsanna den sĂłrt sin a uathoibriĂș, is fĂ©idir leat tosĂș leis pg_innĂ©acs Ăłn mbord pg_catalog.

InnĂ©acsanna neamhĂșsĂĄidte

De rĂ©ir mar a fhorbraĂ­onn feidhmchlĂĄir a ĂșsĂĄideann bunachair shonraĂ­, is amhlaidh a thagann na ceisteanna a ĂșsĂĄideann siad. NĂ­ fĂ©idir innĂ©acsanna a cuireadh leis nĂ­os luaithe a ĂșsĂĄid a thuilleadh le haon cheist. Gach uair a scanadh innĂ©acs, dĂ©anann an bainisteoir staitisticĂ­ Ă© a mharcĂĄil, agus i radharc catalĂłg an chĂłrais pg_stat_user_indexes is fĂ©idir leat an luach a fheiceĂĄil idx_scan, atĂĄ ina chuntar carnach. MĂĄ dhĂ©antar an luach seo a rianĂș thar thrĂ©imhse ama (abair mĂ­) tabharfar smaoineamh maith duit faoi na hinnĂ©acsanna nach bhfuil ĂĄ n-ĂșsĂĄid agus a bhfĂ©adfaĂ­ iad a Ă­sliĂș.

Seo ceist chun na hĂĄirimh reatha scanadh a fhĂĄil ar na hinnĂ©acsanna go lĂ©ir sa scĂ©imre ‘public’:

SELECT relname, indexrelname, idx_scan
FROM   pg_catalog.pg_stat_user_indexes
WHERE  schemaname = 'public';
with output like this:
pagila=# SELECT relname, indexrelname, idx_scan
pagila-# FROM   pg_catalog.pg_stat_user_indexes
pagila-# WHERE  schemaname = 'public'
pagila-# LIMIT  10;
    relname    |    indexrelname    | idx_scan
---------------+--------------------+----------
 customer      | customer_pkey      |    32093
 actor         | actor_pkey         |     5462
 address       | address_pkey       |      660
 category      | category_pkey      |     1000
 city          | city_pkey          |      609
 country       | country_pkey       |      604
 film_actor    | film_actor_pkey    |        0
 film_category | film_category_pkey |        0
 film          | film_pkey          |    11043
 inventory     | inventory_pkey     |    16048
(10 rows)

InnĂ©acsanna a atĂłgĂĄil le nĂ­os lĂș glas

Is minic is gĂĄ innĂ©acsanna a atĂłgĂĄil, mar shampla nuair a thagann siad faoi bhlĂĄth, agus fĂ©adann atĂłgĂĄil an scanadh a bhrostĂș. Chomh maith leis sin is fĂ©idir innĂ©acsanna a fhĂĄil truaillithe. D'fhĂ©adfadh go mbeadh gĂĄ le atĂłgĂĄil na bparaimĂ©adar innĂ©acs freisin.

Cumasaigh cruthĂș innĂ©acs comhthreomhar

In PostgreSQL 11, cruthaĂ­tear innĂ©acs B-Tree i gcomhthrĂĄth. Chun an prĂłiseas cruthaithe a bhrostĂș, is fĂ©idir roinnt oibrithe comhthreomhara a ĂșsĂĄid. Mar sin fĂ©in, dĂ©an cinnte go bhfuil na roghanna cumraĂ­ochta seo socraithe i gceart:

SET max_parallel_workers = 32;
SET max_parallel_maintenance_workers = 16;

TĂĄ na luachanna rĂ©amhshocraithe rĂł-bheag. Go hidĂ©alach, ba cheart go n-ardĂłdh na huimhreacha seo chomh maith le lĂ­on na gcroĂ­the prĂłiseĂĄlaithe. LĂ©igh tuilleadh i doicimĂ©adĂș.

CruthĂș innĂ©acs cĂșlra

Is fĂ©idir leat innĂ©acs a chruthĂș sa chĂșlra ag baint ĂșsĂĄide as an rogha CONCURRENTLY orduithe CREATE INDEX:

pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district);
CREATE INDEX

TĂĄ an nĂłs imeachta cruthĂș innĂ©acs seo difriĂșil Ăłn ngnĂĄthnĂłs sa mhĂ©id is nach dteastaĂ­onn glas ar an tĂĄbla, agus mar sin nĂ­ chuireann sĂ© bac ar oibrĂ­ochtaĂ­ scrĂ­bhneoireachta. Ar an lĂĄimh eile, tĂłgann sĂ© nĂ­os mĂł ama agus Ă­dĂ­onn nĂ­os mĂł acmhainnĂ­.

SolĂĄthraĂ­onn Postgres go leor solĂșbthachta maidir le hinnĂ©acsanna a chruthĂș agus bealaĂ­ chun dĂ©ileĂĄil le haon chĂĄsanna speisialta, chomh maith le bealaĂ­ chun an bunachar sonraĂ­ a bhainistiĂș ar eagla go bhfĂĄsfaidh d’iarratas go plĂ©ascach. TĂĄ sĂșil againn go gcabhrĂłidh na leideanna seo leat do cheisteanna a fhĂĄil go tapa agus do bhunachar sonraĂ­ rĂ©idh de rĂ©ir scĂĄla.

Foinse: will.com

Ceannaigh ĂłstĂĄil iontaofa do shuĂ­mh le cosaint DDoS, freastalaithe VPS VDS đŸ”„ Ceannaigh ĂłstĂĄil grĂ©asĂĄin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster