Shëndeti i indekseve në PostgreSQL nga sytë e një zhvilluesi Java

Përshëndetje.

MĂ« quajnĂ« Vanja, dhe jam zhvillues Java. MĂ« ka ndodhur tĂ« punoj shumĂ« me PostgreSQL – merrem me konfigurimin e databazĂ«s, optimizimin e strukturĂ«s, performancĂ«s dhe pak luaj si DBA gjatĂ« fundjavĂ«s.

Kohet e fundit kam organizuar disa baza të dhënash në shërbimet tona mikrosherbimesh dhe kam shkruar një libër java pg-index-health, i cili e lehtëson këtë punë, kursen kohën time dhe ndihmon në shmangien e disa gabimeve tipike nga zhvilluesit. Pikërisht për këtë libër do të flasim sot.

Shëndeti i indekseve në PostgreSQL nga sytë e një zhvilluesi Java

Shënim ligjor

Versioni kryesor i PostgreSQL me të cilin punoj është 10-ë. Të gjitha kërkesat SQL që përdor gjithashtu janë testuar në versionin 11. Versioni minimal i mbështetur është 9.6.

Pas historia

E gjitha filloi gati njĂ« vit mĂ« parĂ« me njĂ« situatĂ« tĂ« çuditshme pĂ«r mua: krijimi kompetitiv i njĂ« indeksi nĂ« vend tĂ« papritur pĂ«rfundoi me njĂ« gabim. Indeksi vetĂ«, siç ndodh zakonisht, mbeti nĂ« njĂ« gjendje tĂ« pavlefshme nĂ« databazĂ«. Analiza e logĂ«ve tregoi mungesĂ« temp_file_limit. Dhe pastaj filloi
 Pasi hinqa thellĂ«, zbulova njĂ« mori problemesh nĂ« konfigurimin e databazĂ«s dhe, duke rrotulluar mĂ«ngĂ«t, fillova t'i rregulloj me kujdes.

Problemi i parĂ« – konfigurimi default

Ndoshta metafora për Postgres, që mund të startohet në një kafetier, është mjaft e lodhshme për të gjithë, por... konfigurimi për default vërtet e ngre një sërë pyetjesh. Së paku, është e rëndësishme të theksohet maintenance_work_mem, temp_file_limit, statement_timeout dhe lock_timeout.

NĂ« rastin tonĂ« maintenance_work_mem ishte pĂ«r standard 64 MB, kurse temp_file_limit rreth 2 GB – na mungonte thjesht memoria pĂ«r tĂ« krijuar njĂ« indeks nĂ« njĂ« tabelĂ« tĂ« madhe.

Prandaj, në pg-index-health kam mbledhur një sërë parameteresh, sipas mendimit tim, që duhet të konfigurohen për çdo DB.

Problemi i dytĂ« – indekset e pĂ«rsĂ«ritura

Baza jonë jeton në disqe SSD, dhe ne përdorim HA-konfigurimin me disa qendra të të dhënave, një host master dhe n-në numër të replikave. Hapësira në disk është një burim shumë i çmuar për ne; ajo është po aq e rëndësishme sa performanca dhe konsumimi i CPU. Prandaj, nga njëra anë, na duhen indekse për lexim të shpejtë, ndërsa nga ana tjetër, ne nuk duam të shohim indekse të tepërta në DB, pasi ato konsumojnë hapësirë dhe ngadalësojnë përditësimin e të dhënave.

Dhe kĂ«shtu, pasi fshimĂ« tĂ« gjitha indekset e pavlefshme dhe duke parĂ« raportet e Oleg Bartunov, unĂ« vendosa tĂ« bĂ«j njĂ« "pastrim tĂ« madh". Doli se zhvilluesit nuk e pĂ«lqejnĂ« tĂ« lexojnĂ« dokumentacionin e bazĂ«s sĂ« tĂ« dhĂ«nave. ShumĂ« nuk e pĂ«lqejnĂ«. Si rezultat, lindin dy gabime tipike – njĂ« indeks i krijuar manualisht mbi çelĂ«sin primar dhe njĂ« indeks i ngjashĂ«m "manual" mbi njĂ« kolonĂ« unike. Problemi Ă«shtĂ« se nuk janĂ« tĂ« nevojshme – Postgres do t'i bĂ«jĂ« vetĂ«. TĂ« tilla indekse mund tĂ« hiqen me besim, dhe pĂ«r kĂ«tĂ« ka njĂ« diagnostikim. duplicated_indexes.

Problemi i tretĂ« – indekset e mbivendosura

Shumica e zhvilluesve të rinj krijojnë indekse mbi një kolonë. Me kalimin e kohës, pasi e provojnë këtë gjë, fillojnë të optimizojnë kërkesat e tyre dhe të shtojnë indekse më të ndërlikuara që përfshijnë disa kolona. Kështu fillojnë të shfaqen indekset mbi kolonat A, A+B, A+B+C etj. Të parat dy nga këto indekse mund të hidhen pa pasoja, pasi janë prefikse të të tretit. Kjo gjithashtu kursen ndjeshëm hapësirën në disk dhe për këtë ka një diagnostikim. intersected_indexes.

Problemi i katĂ«rt – çelĂ«sat e jashtĂ«m pa indekse

Postgres lejon tĂ« krijojĂ« kufizime tĂ« çelĂ«sit tĂ« jashtĂ«m pa shĂ«nimin e indeksit mbĂ«shtetĂ«s. NĂ« shumĂ« situata, kjo nuk Ă«shtĂ« njĂ« problem dhe madje mund tĂ« mos shfaqet fare
 Deri nĂ« njĂ« moment


KĂ«shtu ndodhi edhe me ne: thjesht nĂ« njĂ« moment, njĂ« punĂ« qĂ« ekzekutohej sipas orarit dhe pastronte bazĂ«n nga porositĂ« testuese, filloi tĂ« na „ngrejĂ«â€œ master hostin. CPU dhe IO shkonin nĂ« plafon, kĂ«rkesat ndalonin dhe prisnin pĂ«r fund. NjĂ« analizĂ« e shpejtĂ« pg_stat_activity tregon se ishin tĂ« bllokuara kĂ«rkesat e llojit:

fshi nga <table> ku ku id në (…)

Këtu, ndoshta, indeksi i id në tabelën përkatëse ishte aty, dhe të dhënat fshiheshin në kushtet që ishin shumë të pakta. Dukej se gjithçka duhej të funksiononte, por, fatkeqësisht, nuk funksiononte.

Në ndihmë erdhi një mrekulli explain analyze dhe tregoi se, përveç fshirjes së të dhënave në tabelën përkatëse, po bëhet edhe një kontroll i integritetit referencial, dhe në një nga tabelat e lidhura, ky kontroll kalon në skanimin sekondar për shkak të mungesës së një indeksi të përshtatshëm. Kështu filloi diagnoza foreign_keys_without_index.

Problemi i pestĂ« – vlera null nĂ« indekse

SĂ« norma, Postgres pĂ«rfshin vlerat null nĂ« indeksat btree, por ato zakonisht nuk kanĂ« nevojĂ« atje. Prandaj unĂ« punoj shumĂ« pĂ«r t'i hequr kĂ«to nullĂ« (diagnostikĂ« indeksat_me_vlera_null), duke krijuar indekse tĂ« pjesshme mbi kolonat e nullable, tĂ« tipit ku <A> nuk Ă«shtĂ« null. KĂ«shtu kam arritur tĂ« zvogĂ«loj pĂ«rmasat e njĂ« prej indekseve tona nga 1877 Mbyte nĂ« 16 Kbyte. NĂ« njĂ« nga shĂ«rbimet tona, pĂ«rmasa totale e DB-sĂ« u ul me 16% (me 4.3 Gbyte nĂ« numra absolutĂ«) pĂ«r shkak tĂ« pĂ«rjashtimit tĂ« vlerave null nga indeksat. NjĂ« kursim colossal hapĂ«sire diskus, me disa pĂ«rmirĂ«sime tĂ« thjeshta. 🙂

Problemi i gjashtĂ« – mungesa e çelqeve primarĂ«

PĂ«r shkak tĂ« veçorive tĂ« mekanizmit MVCC nĂ« Postgres mund tĂ« ndodhĂ« njĂ« situatĂ« si bloat, kur pĂ«rmasat e tabelĂ«s tuaj rriten shpejt pĂ«r shkak tĂ« numrit tĂ« madh tĂ« regjistrimeve tĂ« vdekura. E mendova naiv se kjo nuk do tĂ« na ndodhte dhe se baza jonĂ« nuk do e kishte kĂ«tĂ« fat, sepse ne, oh wow!!!, jemi zhvillues normalë  Sa naiv dhe budalla isha


Një ditë të bukur, një migrim i mrekullueshëm azhurnoi të gjitha rekordet në një tabelë të madhe dhe të përdorur në mënyrë aktive. Ne morëm +100 GB shtesë në madhësinë e tabelës nga asgjë. Ishte mjaft e padëshirueshme, por aventurat tona nuk përfunduan këtu. Pas 15 orësh që avakuumi automatik për këtë tabelë u përfundua, u kuptua se vendi fizik nuk do të kthehej. Nuk mundëm të ndalonim shërbimin dhe të bënim një VACUUM FULL, prandaj u mor vendimi për të përdorur pg_repack. Dhe këtu doli se pg_repack nuk di të përpunojë tabelat pa çelës primar ose ndonjë kufizim unikal, ndërsa për tabelën tonë nuk kishte çelës primar. Kjo e solli diagnostikimin tables_without_primary_key.

Në versionin e bibliotekës 0.1.5 u shtua mundësia për të mbledhur të dhëna mbi bloat-in e tabelave dhe indekseve dhe për t'u përgjigjur në mënyrë të duhur.

Problemet shtatĂ« dhe tetĂ« – mungesa e indekseve dhe indekset e papĂ«rdorura

Dy diagnostikat e ardhshme — tables_with_missing_indexes dhe unused_indexes – nĂ« formĂ«n e tyre pĂ«rfundimtare u shfaqĂ«n relativisht kohĂ«t e fundit. Problemi Ă«shtĂ« se ato nuk mund tĂ« shtoheshin lehtĂ«sisht.

Si e thashë më parë, ne përdorim një konfigurim me disa replika, dhe ngarkesa e lexim për hoste të ndryshëm është principialisht e ndryshme. Si rezultat, arrihet një situatë ku disa tabela dhe indekse në disa hoste praktikisht nuk përdoren, dhe për analizë është e nevojshme të mblidhet statistika nga të gjithë hostet në kluster. Rivendos statistikat po ashtu duhet të bëhet në çdo host në kluster, nuk mund të bëhet vetëm në master.

Ky qasje na lehoi të kursejmë disa dhjetëra gigabajt duke fshirë indekse që kurrë nuk ishin përdorur, si dhe të shtojmë indekse të munguar për tabela që përdoren rrallë.

Si përfundim

Sigurisht, për praktisht të gjitha diagnostikimet mund të konfigurohet lista e përjashtimeve. Kështu mund të implementoni shpejt kontrolle në aplikacionin tuaj, duke parandaluar shfaqjen e gabimeve të reja, dhe më pas gradualisht të korrigjoni ato të vjetra.

Disa diagnostika mund të ekzekutohen tashmë në testet funksionale menjëherë pas aplikimit të migrimeve të DB. Dhe kjo, ndoshta, është një nga funksionalitetet më të fuqishme të bibliotekës sime. Një shembull përdorimi mund të shikohet në demo.

Kontrollat për indekse të papërdorura ose të mungesës, si dhe për bloat, ka kuptim të kryhen vetëm në një DB reale. Vlerat e mbledhura mund të shkruhen në ClickHouse ose dërgohen në sistemin e monitorimit.

Shpresoj shumë se pg-index-health do të jetë e dobishme dhe e kërkuar. Ju gjithashtu mund të kontribuoni në zhvillimin e bibliotekës duke raportuar çështjet e zbuluara dhe duke sugjeruar diagnostika të reja.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster