Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O le lipoti o loʻo tuʻuina atu ai nisi o auala e mafai ai mataituina le faatinoga o fesili SQL pe a faitau miliona i latou i le aso, ma o loʻo i ai le faitau selau o sapalai PostgreSQL mataʻituina.

O a ni fofo faʻapitoa e mafai ai ona tatou faʻaogaina lelei le tele o faʻamatalaga, ma faʻafefea ona faafaigofieina le olaga o se tagata atiaʻe masani?


O ai e fiafia? au'ili'iliga o fa'afitauli fa'apitoa ma metotia fa'asilisili eseese SQL fesili ma foia faʻafitauli masani DBA i PostgreSQL - e mafai foi faitau se faasologa o tala i lenei autu.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)
O loʻu igoa o Kirill Borovikov, ou te fai ma sui Kamupani Tensor. Aemaise lava, ou te faʻapitoa i le galue ma faʻamaumauga i la matou kamupani.

O le asō o le a ou taʻu atu ia te oe pe faʻafefea ona matou faʻamalieina fesili, pe a e le manaʻomia le "vaʻaia" le faʻatinoga o se fesili se tasi, ae foia le faʻafitauli i le tele. Pe a i ai le faitau miliona o talosaga, ma e tatau ona e suʻeina nisi auala i fofo lenei faafitauli tele.

I se tulaga lautele, Tensor mo le miliona o matou tagata faʻatau VLSI o la matou talosaga: fesoʻotaʻiga faʻaagafesootai tuʻufaʻatasia, fofo mo fesoʻotaʻiga vitio, mo le faʻaogaina o pepa i totonu ma fafo, faiga faʻamatalaga mo faʻamaumauga ma fale teu oloa, ... O lona uiga, o se "mega-combine" mo pulega faʻapisinisi tuʻufaʻatasia, lea e sili atu i le 100 eseese. galuega i totonu.

Ina ia mautinoa o loʻo galulue uma ma atinaʻe masani, o loʻo i ai a matou atinaʻe 10 i totonu o le atunuʻu, ma sili atu 1000 atinaʻe.

Sa matou galulue faʻatasi ma PostgreSQL talu mai le 2008 ma ua faʻaputuina le tele o mea matou te faʻatautaia - faʻamaumauga a tagata o tausia, fuainumera, auʻiliʻili, faʻamaumauga mai faʻamatalaga faʻamatalaga fafo - sili atu i le 400TB. E tusa ma le 250 servers i le gaosiga na o ia, ma i le aofaʻi e tusa ma le 1000 database servers matou te mataʻituina.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

SQL o se gagana fa'aalia. E te le faamatalaina "faʻafefea" se mea e tatau ona galue, ae "o le a" e te manaʻo e ausia. E sili atu le iloa e le DBMS pe faʻafefea ona fai se JOIN - faʻafefea ona faʻafesoʻotaʻi au laulau, o a tulaga e tuʻuina atu, o le a le mea e alu i totonu o le faasino igoa, o le a le mea e le ...

O nisi DBMS e talia faʻamatalaga: "Leai, faʻafesoʻotaʻi nei laulau e lua i se laina faʻapea ma faapena," ae le mafai e PostgreSQL ona faia lenei mea. O le tulaga faʻapitoa lea o le taʻitaʻia o atinaʻe: "Matou te manaʻo e faʻamaeʻa le suʻesuʻega sili atu nai lo le faʻatagaina o tagata atiaʻe e faʻaaoga nisi ituaiga o faʻamatalaga."

Ae, e ui lava i le mea moni e le faatagaina e PostgreSQL le "fafo" e pulea ia lava, e faʻatagaina atoatoa vaai po o le a le mea o tupu i totonu ia te iape a fai lau su'esu'ega, ma po'o fea o iai fa'afitauli.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

I se tulaga lautele, o a fa'afitauli masani e masani ona sau ai se tagata e fa'atupuina [i se DBA]? “O iinei na matou faataunuuina ai le talosaga, ma ua tuai mea uma ia i tatou, o loʻo tautau mea uma, o loʻo tupu se mea ... O se ituaiga o faʻalavelave!"

O mafuaʻaga e toetoe lava tutusa i taimi uma:

  • algorithm fesili le lelei
    Atinaʻe: "O lea ua ou tuʻuina atu ia te ia 10 laulau i SQL e ala i le JOIN ..." - ma faʻamoemoe o ona tulaga o le a faʻavavega lelei "nonoa" ma o le a vave ona ia mauaina mea uma. Ae e le tupu ni vavega, ma o soʻo se faiga e iai se fesuiaiga (10 laulau i le tasi FROM) e masani lava ona tuʻuina atu se ituaiga o mea sese. [se tusiga]
  • fuainumera le talafeagai
    O lenei manatu e matua talafeagai lava mo PostgreSQL, pe a e "sasaa" se faʻamaumauga tele i luga o le 'auʻaunaga, fai se talosaga, ma e "sexcanits" lau laulau. Aua o ananafi e 10 faʻamaumauga i totonu, ma o aso nei e 10 miliona, ae e leʻi iloa e PostgreSQL lenei mea, ma e tatau ona tatou taʻu atu i ai. [se tusiga]
  • "pulu" i punaoa
    Ua e fa'apipi'iina se fa'amaumauga tele ma tele le utaina i luga o se 'au'aunaga vaivai e le lava le tisiki, manatua, po'o le fa'atinoina o gaioiga. Ma na pau lava ... I se mea o loʻo i ai se faʻalo faʻatinoga i luga aʻe e le mafai ona e toe oso.
  • poloka
    Ole mea faigata lea, ae sili ona talafeagai mo su'esu'ega fa'afesili (INSERT, UPDATE, DELETE) - ole mataupu tele lea.

Mauaina o se fuafuaga

...Ma mo isi mea uma tatou mana'omia se fuafuaga! E tatau ona tatou vaʻai i le mea o loʻo tupu i totonu o le 'auʻaunaga.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ole fuafuaga ole fa'atonuga ole PostgreSQL ole la'au ole algorithm ole fa'atinoina ole fesili ile fa'atusa o tusitusiga. O le mea tonu lava lea o le algorithm, o se taunuuga o suʻesuʻega a le fuafuaga, na maua e sili ona aoga.

O node laau taʻitasi o se gaioiga: toe maua mai faʻamatalaga mai se laulau poʻo se faasino igoa, fausiaina o se faʻataʻitaʻiga, faʻapipiʻi laulau e lua, tuʻufaʻatasia, faʻafesoʻotaʻi, pe le aofia ai filifiliga. O le fa'atinoina o se su'esu'ega e aofia ai le savali i pito o lenei la'au.

Ina ia maua le fuafuaga o fesili, o le auala pito sili ona faigofie o le faʻatinoina o le faʻamatalaga EXPLAIN. Ina ia maua uma uiga moni, o lona uiga, ia faia moni se fesili i luga o le faavae - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Le vaega leaga: pe a e tamoe, e tupu "iinei ma le taimi nei", o lea e naʻo le fetaui mo le faʻaogaina o le lotoifale. Afai e te aveina se sapalai e maualuga le utaina o loʻo i lalo o se tafega malosi o suiga o faʻamaumauga, ma e te vaʻai: "Oi! O lea e fai si fa'agesegese le fa'atinoinaся talosaga." Afa itula, itula talu ai - a'o e tamo'e ma maua mai lenei talosaga mai ogalaau, toe aumai i le 'au'aunaga, ua suia uma au fa'amaumauga ma fuainumera. E te ta'avale e debug - ma e tamo'e vave! Ma e le mafai ona e malamalama pe aisea, aisea sa lemu.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ina ia malamalama i le mea na tupu tonu i le taimi na faia ai le talosaga i luga o le 'auʻaunaga, na tusia e tagata atamamai auto_explain module. O loʻo iai i le toetoe o faʻasalalauga masani PostgreSQL, ma e mafai ona faʻagaoioia i le faila faila.

Afai na te iloa o nisi talosaga e umi atu nai lo le tapulaʻa na e taʻu atu i ai, e faia “snapshot” o le fuafuaga o lenei talosaga ma tusia faatasi i le ogalaau.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

E foliga mai o loʻo lelei mea uma i le taimi nei, matou te o atu i le ogalaau ma vaʻai ai iina ... [tusi vaevae]. Ae e le mafai ona matou fai atu se mea e uiga i ai, e ese mai i le mea moni o se fuafuaga sili ona lelei aua e manaʻomia le 11ms e faʻatino ai.

E foliga mai o loʻo lelei mea uma - ae leai se mea o manino le mea na tupu. E ese mai i le taimi masani, matou te le vaʻaia lava se mea. Auā o le va'ava'ai i se “tama'i mamoe” o tusitusiga manino e masani lava e lē vaaia.

Ae tusa lava pe le o manino, e tusa lava pe le talafeagai, e tele atu faʻafitauli faʻavae:

  • Ua faailoa mai e le node aofaiga o puna'oa o le la'au la'au atoa i lalo o ia. O lona uiga, e le mafai ona e suʻesuʻeina le tele o le taimi na faʻaalu i lenei Faʻamatalaga Faʻamatalaga faʻapitoa pe afai o loʻo i ai se tulaga faʻapipiʻi i lalo. E tatau ona tatou vaʻavaʻai ma le malosi e vaʻai pe o iai ni "fanau" ma fesuiaiga o tuutuuga, CTE i totonu - ma toesea uma nei "i o tatou mafaufau".
  • Lona lua: o le taimi o loʻo faʻaalia i luga o le node o le taimi fa'atino tasi node. Afai o lenei node na faʻataunuʻuina o se taunuuga o, mo se faʻataʻitaʻiga, o se matasele i luga o le laulau e faʻamaumau faʻatasi, ona faʻateleina lea o le numera o faʻamau-taamilosaga o lenei node-i le fuafuaga. Ae o le taimi o le faʻatinoina o atomic lava ia e tumau pea i tulaga o fuafuaga. O lona uiga, ina ia malamalama pe o le a le umi na faia ai lenei node i le aofaʻi, e tatau ona e faʻateleina le tasi mea i le isi - toe, "i lou ulu."

I tulaga faapena, malamalama "O ai le sooga vaivai?" toetoe a le mafai. O le mea lea, e oʻo lava i le au atinaʻe latou te tusia i le "tusi lesona" lena "O le malamalama i se fuafuaga o se faatufugaga e tatau ona aʻoaʻoina, poto masani...".

Ae o loʻo i ai a matou atinaʻe 1000, ma e le mafai ona e faʻamatalaina lenei aafiaga ia i latou taʻitoʻatasi. O aʻu, o oe, na te iloa, ae e le o toe iloa e se tasi iina. Atonu o le a ia aʻoaʻoina, pe leai, ae e manaʻomia ona galue nei - ma o fea e maua ai lenei poto masani?

Fuafua fa'aaliga

O le mea lea, na matou iloa ai ina ia mafai ona taulimaina nei faʻafitauli, matou te manaʻomia vaaiga lelei o le fuafuaga. [tusitala]

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Na matou alu muamua "i le maketi" - seʻi o tatou vaʻavaʻai i luga ole Initaneti e vaʻai pe o le a le mea o iai.

Ae na aliali mai e itiiti lava ni fofo "ola" e sili atu pe itiiti foi le atinaʻeina - moni, naʻo le tasi: explain.depesz.com saunia e Hubert Lubaczewski. A e ulufale i totonu o le "fafaga" fanua o se faʻamatalaga tusitusia o le fuafuaga, e faʻaali atu ia te oe se laulau ma faʻamaumauga faʻasalalau:

  • le taimi e galue ai le node
  • taimi atoa mo le la'au atoa
  • numera o fa'amaumauga na toe maua mai na fa'amoemoeina fa'afuainumera
  • le tino node lava ia

O lenei 'au'aunaga e iai fo'i le tomai e fa'asoa ai se fa'amaumauga o so'otaga. Na e lafoina lau fuafuaga iina ma fai mai: "Ei, Vasya, o le soʻotaga lenei, o loʻo i ai se mea o loʻo i ai iina."

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ae e iai foʻi faafitauli laiti.

Muamua, o se aofaiga tele o le "kopi-pasi". E te ave se fasi ogalaau, faapipii i ai, ma toe, ma toe fai.

Lona lua, leai se auiliiliga o le aofaʻi o faʻamatalaga faitau - o paluga tutusa e maua mai EXPLAIN (ANALYZE, BUFFERS), matou te le o vaaia iinei. Na te le iloa pe faʻafefea ona faʻaumatia i latou, malamalama ia i latou ma galulue ma i latou. A e faitauina le tele o faʻamatalaga ma iloa e te ono faʻaseseina le disk ma manatua cache, o lenei faʻamatalaga e taua tele.

O le tulaga le lelei lona tolu o le vaivai tele o le atinaʻeina o lenei poloketi. O tautinoga e laʻititi lava, e lelei pe a tasi i le ono masina, ma o le code o loʻo i Perl.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ae o "pese" uma lava, e mafai ona tatou ola ai i lenei mea, ae e tasi le mea na matua liliu ese ai i tatou mai lenei auaunaga. O mea sese ia i le au'ili'iliga o le Common Table Expression (CTE) ma le tele o nodes malosi e pei o InitPlan/SubPlan.

Afai e te talitonu i lenei ata, o le taimi atoa o le faʻatinoina o node taʻitasi e sili atu nai lo le taimi atoa o le faʻatinoga o le talosaga atoa. E faigofie lava- e le'i toesea le taimi o le gaosiga o lenei CTE mai le CTE Scan node. O le mea lea, matou te le toe iloa le tali saʻo i le umi na faia ai le CTE scan lava ia.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ona matou iloa ai lea ua oʻo i le taimi e tusi ai a matou lava tusi - hurray! Fai mai tagata atiae uma: "O lenei o le a matou tusia a matou lava mea, o le a matua faigofie lava!"

Na matou ave se faʻaputu masani mo 'auʻaunaga i luga ole laiga: o se autu faʻavae ile Node.js + Express, faʻaaoga Bootstrap ma D3.js mo ata matagofie. Ma o matou faʻamoemoe na faʻamaonia atoatoa - matou maua le faʻataʻitaʻiga muamua i le 2 vaiaso:

  • fa'avasega fuafuaga fa'apitoa
    O lona uiga, o lea e mafai ona tatou vaʻaia soʻo se fuafuaga mai mea na gaosia e PostgreSQL.
  • su'esu'ega sa'o o nodes malosi - CTE Scan, InitPlan, SubPlan
  • au'ili'iliga o le tufatufaina o pa'u - o fea e faitau ai itulau fa'amaumauga mai le manatua, o fea mai le fa'apitonu'u, o fea mai le disk
  • maua le manino
    Ina ia aua nei "eli" nei mea uma i totonu o le ogalaau, ae ia vaʻai i le "sootaga sili ona vaivai" i le taimi lava lea i le ata.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Na matou maua se mea faʻapenei, faʻatasi ai ma faʻailoga faʻapipiʻi e aofia ai. Ae e masani lava e le o toe galulue a tatou atinaʻe ma se faʻataʻitaʻiga atoatoa o le fuafuaga, ae faʻatasi ai ma se faʻapuupuu. A uma mea uma, ua uma ona matou faʻavasega numera uma ma togi i latou i le agavale ma le taumatau, ma i le ogatotonu na matou tuʻu ai naʻo le laina muamua, o le a le ituaiga o node: CTE Scan, CTE generation poʻo Seq Scan e tusa ai ma nisi faʻailoga.

O le fa'apu'upu'u fa'atusa lea tatou te ta'ua ata faataitai.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O le a se isi mea e faigofie? E faigofie le va'ai po'o le a le fa'asoa o lo tatou taimi atoa o lo'o tu'uina atu i le fea node - ma na'o le "pipii" i le itu. paʻu paʻu.

Matou te faʻasino i le node ma vaʻai - e foliga mai o Seq Scan e itiiti ifo ma le kuata o le taimi atoa, ae o le 3/4 totoe na ave e le CTE Scan. Mata'utia! Ose fa'amatalaga la'ititi lea e uiga i le "fua o le afi" o le CTE Scan pe afai e te fa'aogaina ma le to'a i au fesili. E le vave tele - e maualalo ifo nai lo le su'eina masani o laulau. [tusitala] [tusitala]

Ae e masani lava o ia ata e sili atu ona manaia, sili atu ona faigata, pe a tatou tusi vave i se vaega ma vaʻai, mo se faʻataʻitaʻiga, e sili atu ma le afa o le taimi o nisi Seq Scan "ai". E le gata i lea, sa i ai se ituaiga o Filter i totonu, o le tele o faʻamaumauga na lafoaia e tusa ai ma ia ... E mafai ona e togi saʻo lenei ata i le tagata atiaʻe ma fai atu: "Vasya, e leaga mea uma iinei mo oe! Fa'ata'ita'i, va'ai - o lo'o i ai se mea fa'aletonu!"

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

E masani lava, sa i ai ni "rake" na aofia ai.

O le mea muamua na matou oʻo i ai o le faʻafitauli lapotopoto. O le taimi o node taʻitasi i le fuafuaga o loʻo faʻaalia ma le saʻo o le 1 μs. Ma pe a sili atu le numera o taamilosaga node, mo se faʻataʻitaʻiga, 1000 - pe a maeʻa le faʻatinoina o le PostgreSQL vaevae "i totonu o le saʻo", ona faʻatatau lea i tua tatou te maua le taimi atoa "i le va o le 0.95ms ma le 1.05ms". A o'o le faitau ile microseconds, e lelei, ae a o'o i le [mili] sekone, e tatau ona e amanaia lenei fa'amatalaga pe a "talatala" punaoa i nodes o le fuafuaga "o ai na fa'aaogaina le tele".

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O le vaega lona lua, sili atu ona faigata, o le tufatufaina atu o punaoa (na paʻu) i totonu o nodes malosi. O le mea lea na matou tau ai le 2 vaiaso muamua o le faʻataʻitaʻiga faʻatasi ai ma le isi 4 vaiaso.

E fai lava si faigofie e maua ai lenei ituaiga o faʻafitauli - matou te faia se CTE ma faʻapea e faitau se mea i totonu. O le mea moni, PostgreSQL e "atamai" ma o le a le faitauina saʻo se mea iina. Ona matou ave lea o le faamaumauga muamua mai ai, ma i ai le selau ma le muamua mai le CTE lava e tasi.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Matou te vaʻavaʻai i le fuafuaga ma malamalama - e ese, e 3 a matou paʻu (itulau faʻamatalaga) "faʻaaogaina" i le Seq Scan, 1 isi i le CTE Scan, ma le 2 isi i le CTE Scan lona lua. O lona uiga, afai tatou te faʻaputuina mea uma, o le a tatou maua le 6, ae mai le laulau tatou te faitau ai na o le 3! E le faitau e le CTE Scan se mea mai so'o se mea, ae galue sa'o ma le manatua o le faagasologa. O lona uiga, e iai se mea o loʻo manino mai o loʻo sese iinei!

O le mea moni, e aliali mai o itulau uma nei o faʻamaumauga e 3 na talosagaina mai le Seq Scan, muamua 1 na talosagaina le 1st CTE Scan, ona sosoo ai lea ma le 2nd, ma le isi 2 na faitau atu ia te ia. 3 itulau sa faitauina fa'amaumauga, ae le o le 6.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ma o lenei ata na taʻitaʻia ai i matou i le malamalama o le faʻatinoina o se fuafuaga e le o se laʻau, ae na o se ituaiga o kalafi acyclic. Ma sa matou maua se ata e pei o lenei, ina ia tatou malamalama "mea na sau mai le mea muamua." O lona uiga, o iinei na matou fatuina ai se CTE mai le pg_class, ma fesili faalua, ma toetoe lava o lo matou taimi uma na faʻaalu i le paranesi pe a matou talosagaina i le taimi lona lua. E manino lava o le faitauina o le 2st entry e sili atu le taugata nai lo le naʻo le faitauina o le 101st entry mai le laulau.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Sa ma manava mo sina taimi. Na latou fai mai: “O lenei, Neo, ua e iloa le kung fu! O lea ua sa'o la matou poto masani i luga o lau lau. O lea e mafai ona e faʻaaogaina." [tusitala]

Fa'atasiga ogalaau

O matou 1000 atiaʻe na manavaina se mapuea. Ae na matou malamalama e naʻo le fiaselau o 'auʻaunaga "tau", ma o nei "kopi-faʻapipiʻi" uma a le au atiaʻe e le faigofie. Na matou iloa e tatau ona matou aoina e i matou lava.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

I se tulaga lautele, o loʻo i ai se faʻasologa masani e mafai ona aoina fuainumera, peitaʻi, e manaʻomia foi ona faʻagaoioia i le config - lenei module pg_stat_statements. Ae sa le fetaui o ia ia i tatou.

Muamua, e tuʻuina atu i fesili tutusa e faʻaaoga ai polokalame eseese i totonu ole faʻamaumauga tutusa ese'ese QueryIds. O lona uiga, afai e te faia muamua SET search_path = '01'; SELECT * FROM user LIMIT 1;ona sosoo ai lea SET search_path = '02'; ma le talosaga lava e tasi, o le a iai faʻamaumauga eseese o fuainumera o lenei module, ma o le a le mafai ona ou aoina faʻamaumauga lautele faʻapitoa i le tulaga o lenei faʻamatalaga talosaga, e aunoa ma le amanaia o polokalame.

O le manatu lona lua na taofia ai i matou mai le faʻaaogaina o le leai ni fuafuaga. O lona uiga, e leai se fuafuaga, e na o le talosaga lava ia. Matou te vaʻai i le mea na faʻagesegese, ae matou te le malamalama pe aisea. Ma o iinei tatou te toe foi i le faʻafitauli o se faʻasologa vave o suiga.

Ma o le taimi mulimuli - leai o "mea moni". O lona uiga, e le mafai ona e faʻatalanoaina se faʻataʻitaʻiga faʻapitoa o le faʻatinoina o fesili - e leai se mea, e naʻo faʻamaumauga tuʻufaʻatasia. E ui lava e mafai ona galue i lenei mea, e matua faigata lava.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O le mea lea, na matou filifili ai e tau le kopi-pasi ma amata ona tusitusi tagata aoina.

E fesoʻotaʻi le tagata aoina e ala i le SSH, faʻatuina se fesoʻotaʻiga malupuipuia i le 'auʻaunaga ma le faʻamaumauga e faʻaaoga ai se tusi faamaonia, ma tail -F “pipii” i ai i le faila ogalaau. O lea la i lenei sauniga tatou maua se "faaata" atoatoa o le faila ogalaau atoa, lea e gaosia e le server. O le uta i luga o le 'auʻaunaga lava ia e laʻititi, aua matou te le vaʻaia se mea iina, matou te faʻataʻitaʻia le auala.

Talu ai ua uma ona matou amata tusia le atinaʻe i Node.js, na matou faʻaauau pea ona tusia le aoina i totonu. Ma o lenei tekinolosi ua faʻamaonia ia lava, aua e matua faigofie lava le faʻaogaina o le JavaScript e galue ai ma faʻamaumauga faʻapipiʻi vaivai, o le ogalaau. Ma o le Node.js infrastructure lava ia e avea o se faʻailoga pito i tua e mafai ai e oe ona faigofie ma faigofie ona galue i fesoʻotaʻiga fesoʻotaʻiga, ma e moni lava i soʻo se vaitafe faʻamatalaga.

E tusa ai ma lea, matou te "faʻalauteleina" fesoʻotaʻiga e lua: o le muamua e "faʻalogo" i le ogalaau lava ia ma ave ia i matou lava, ma le lona lua e fesili i lea taimi ma lea taimi le faavae. "Ae o loʻo faʻaalia e le ogalaau o loʻo poloka le faʻailoga o loʻo i ai le oid 123," ae e leai se uiga o lenei mea i le atinaʻe, ma e manaia le fesili i le database, "O le a le OID = 123?" Ma o lea matou te fesili ai i lea taimi ma lea taimi i le faavae mea matou te leʻi iloa e uiga ia i matou lava.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

"E tasi lava le mea e te leʻi manatu i ai, o loʻo i ai se ituaiga o pi e pei o le elefane!.." Na amata ona matou atiaʻe lenei faiga ina ua matou manaʻo e mataʻituina le 10 servers. O le mea e sili ona taua i lo tatou malamalama, lea na tulai mai ai nisi o faafitauli sa faigata ona taulimaina. Ae i le taimi o le kuata muamua, na matou mauaina le selau mo le mataʻituina - ona o le faiga o loʻo galue, e manaʻo uma i ai, sa lelei tagata uma.

O nei mea uma e manaʻomia ona faʻaopoopoina, o le tafe o faʻamatalaga e tele ma malosi. O le mea moni, o mea tatou te mataʻituina, mea e mafai ona tatou taulimaina, o mea ia tatou te faʻaaogaina. Matou te faʻaaogaina foi le PostgreSQL e fai ma faʻamaumauga. Ma e leai se mea e sili atu ona vave "sasaa" faʻamatalaga i totonu nai lo le tagata faʻatautaia COPY E le'o le taimi nei.

Ae na o le "sasaa" faʻamatalaga e le o la tatou tekinolosi. Aua afai e tusa ma le 50k talosaga i le sekone i luga o le selau sapalai, o le a maua ai le 100-150GB o ogalaau i le aso. O le mea lea, sa tatau ona matou "tipi" ma le faaeteete le faavae.

Muamua, sa matou faia vaeluaga i le aso, aua, i le lautele, e leai se tasi e fiafia i le faʻamaopoopoina o aso. O le a le eseesega e faia ai le mea na e maua ananafi, pe afai o le po nei na e taʻavale ai se faʻamatalaga fou o le talosaga - ma ua uma ona iai ni fuainumera fou.

Lona lua, na matou aʻoaʻoina (na faʻamalosia) matua, vave tele e tusitusi faʻaaoga COPY. O lona uiga, e le na'o COPYauā e sili atu lona vave nai lo INSERT, ma sili atu ona vave.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O le vaega lona tolu - sa tatau ona ou faia lafoa'i fa'aoso, fa'asologa, ma ki mai fafo. O lona uiga, e leai lava se tatou fa'amaoni fa'asino. Aua afai e iai sau laulau o loʻo i ai se pea FKs, ma e te fai mai i totonu o le faʻamaumauga o faʻamaumauga e faapea "o se faʻamaumauga ogalaau lea e faʻasino e FK, mo se faʻataʻitaʻiga, i se vaega o faʻamaumauga," ona e faʻaofiina lea, PostgreSQL ua leai se mea o totoe ae o le auala e ave ai ma fai ma le faamaoni SELECT 1 FROM master_fk1_table WHERE ... fa'atasi ai ma le fa'ailoga o lo'o e taumafai e fa'aofi - na'o le siaki o lo'o iai lenei fa'amaumauga iina, e te le "vavae ese" lenei Kisi mai fafo i lou fa'aofiina.

Nai lo le tasi fa'amaumauga i le laulau fa'atatau ma ona fa'asinomaga, tatou te maua le fa'amanuiaga fa'aopoopo o le faitau mai laulau uma o lo'o fa'asino i ai. Ae matou te le manaʻomia lenei mea - o la matou galuega o le faʻamaumau i le tele e mafai ai ma vave i le vave e mafai ai ma sina uta itiiti. O lea FK - i lalo!

O le isi vaega o le tu'ufa'atasiga ma le fa'asalaina. I le taimi muamua, matou te faʻatinoina i totonu o faʻamaumauga - pe a uma, e faigofie lava, pe a oʻo mai se faʻamaumauga, fai i totonu o se ituaiga o laulau. "faaopoopo le tasi" sa'o i le fa'aoso. Ia, e faigofie, ae o le mea leaga lava e tasi - e te tuʻuina se tasi faʻamaumauga, ae faʻamalosia e faitau ma tusi se isi mea mai se isi laulau. E le gata i lea, e le gata e te faitau ma tusitusi, e te faia foi i taimi uma.

Vaʻai nei o loʻo i ai sau laulau e te faitauina ai le numera o talosaga na pasia i se talimalo faapitoa: +1, +1, +1, ..., +1. Ma o oe, i le mataupu faavae, e te le manaʻomia lenei mea - e mafai uma aofaiga i le manatua i luga o le aoina ma lafo i le database i le tasi alu +10.

Ioe, i le tulaga o nisi faʻafitauli, o lau amio saʻo e mafai ona "vavae ese", ae o se mea e toetoe lava a le talafeagai - ona o loʻo i ai sau server masani, o loʻo i ai se maa i totonu o le pule, o loʻo i ai sau faʻamatalaga fefaʻatauaiga, o se ogalaau i luga o le faiga faila... I se tulaga lautele, e le aoga. O le leiloa o le gaosiga e te maua mai le fa'aosoina o fa'aoso/FK e le taulia le tupe fa'aalu e te maua.

E tutusa lava ma le hashing. O se talosaga e lele atu ia te oe, e te fuafuaina se faʻamatalaga patino mai ai i totonu o le database, tusi i le database ona taʻu atu lea i tagata uma. O loʻo lelei mea uma seʻia oʻo i le taimi o le pueina, e sau se tagata lona lua ia te oe o loʻo manaʻo e puʻeina le mea lava e tasi - ma e poloka, ma ua leaga lenei mea. O le mea lea, afai e mafai ona e faʻafeiloaʻi le gaosiga o nisi ID i le kalani (faʻatatau i le database), e sili atu le faia o lenei mea.

Naʻo le lelei atoatoa mo i matou e faʻaaoga le MD5 mai le tusitusiga - talosaga, fuafuaga, faʻataʻitaʻiga, ... Matou te faʻatusatusa i le itu e aoina, ma "sasaa" le ID ua saunia i totonu o le database. Ole umi ole MD5 ma le vaeluaga i aso uma e mafai ai ona tatou le popole i faʻalavelave faʻafuaseʻi.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ae ina ia vave faʻamaumau nei mea uma, matou te manaʻomia le toe faʻaleleia o le faiga o le pueina o ia lava.

E fa'afefea ona e tusia fa'amaumauga masani? E i ai a matou ituaiga o faʻamaumauga, matou vaevaeina i ni laulau, ona KOPY ai lea - muamua i le muamua, ona sosoo ai lea ma le lona lua, i le lona tolu ... E le faigofie, aua e foliga mai o loʻo matou tusia se tasi o faʻamaumauga i ni laasaga se tolu. fa'asolosolo. Le fiafia. E mafai ona fai vave? E mafai!

Ina ia faia lenei mea, ua lava naʻo le faʻaleagaina o nei tafe i le tutusa ma le tasi. E foliga mai o loʻo i ai a matou mea sese, talosaga, faʻataʻitaʻiga, poloka, ... felelei i filo eseese - ma matou tusia uma i le tutusa. Ua lava mo lenei fa'aauau pea ona tatala se ala COPY mo laulau ta'itasi ta'itasi.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O lona uiga, i le ao aoina e i ai lava se vaitafe, lea e mafai ona ou tusia ai faʻamaumauga ou te manaʻomia. Ae ina ia vaʻaia e le database lenei faʻamatalaga, ma e le faʻapipiʻi se tasi e faʻatali mo lenei faʻamatalaga e tusia, KOPI e tatau ona fa'alavelave i nisi taimi. Mo matou, o le taimi sili ona aoga e tusa ma le 100ms - matou te tapunia ma toe tatala vave i le laulau e tasi. Ma afai e le lava a tatou tafega e tasi i nisi o tumutumu, ona tatou tuufaatasia lea i se tapulaa patino.

E le gata i lea, na matou iloa ai mo sea faʻamatalaga o uta, soʻo se faʻapotopotoga, pe a aoina faʻamaumauga i vaega, e leaga. O le leaga masani INSERT ... VALUES ma isi faamaumauga e 1000. Aua o le taimi lena o loʻo i ai sau pito i luga o le aufaasālalau, ma o isi tagata uma e taumafai e tusi se mea i le disk o le a faʻatali.

Ina ia faʻateʻaina ia faʻalavelave, naʻo le faʻapipiʻiina o se mea, 'aua lava ne'i faapalepale. Ma afai e tupu le faʻafefe i le disk (lelei, o le Stream API i Node.js e mafai ai ona e suʻeina) - tolopo lenei fesoʻotaʻiga. A e mauaina se mea na tupu e toe maua fua, tusi i ai mai le laina faʻaputu. Ma a'o pisi, ave le isi avanoa saoloto mai le vaitaele ma tusi i ai.

Aʻo leʻi faʻalauiloaina lenei auala i le faʻamaumauga o faʻamaumauga, e tusa ma le 4K tusitusi ops, ma i lenei auala na matou faʻaititia ai le uta i le 4 taimi. Ole taimi nei ua toe fa'atupuina le isi 6 taimi ona o fa'amaumauga fou e mata'ituina - e o'o atu ile 100MB/s. Ma o lenei matou te teuina ogalaau mo le 3 masina mulimuli i se voluma e tusa ma le 10-15TB, ma le faʻamoemoe o le na o le tolu masina o le a mafai ai e soʻo se atinaʻe ona foia soʻo se faʻafitauli.

Tatou te malamalama i faafitauli

Ae na o le aoina o nei faʻamatalaga uma e lelei, aoga, talafeagai, ae le lava - e manaʻomia ona malamalama. Aua e faitau miliona ia fuafuaga eseese i le aso.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ae o le faitau miliona e le mafai ona pulea, e tatau ona tatou faia muamua le "laititi". Ma, muamua lava, e tatau ona e filifili pe faʻapefea ona e faʻatulagaina lenei mea "laʻititi".

Ua matou faailoaina ni manatu autu se tolu:

  • o ai auina atu lenei talosaga
    O lona uiga, mai le a le talosaga na "tauu": upega tafaʻilagi, backend, faiga totogi poʻo se isi mea.
  • le mea na tupu
    O le a le server patino? Aua afai e tele au 'auʻaunaga i lalo o le tasi talosaga, ma faʻafuaseʻi ona "valea" le tasi (ona o le "tisiki e pala", "manatua lemu", o se isi faʻafitauli), ona e manaʻomia lea e faʻafesoʻotaʻi faʻapitoa le server.
  • auala o le faʻafitauli na faʻaalia i se tasi auala poʻo se isi

Ina ia malamalama "o ai" na auina mai ia i matou se talosaga, matou te faʻaaogaina se meafaigaluega masani - faʻatulagaina se fesuiaiga o le vasega: SET application_name = '{bl-host}:{bl-method}'; - matou te tuʻuina atu le igoa o le pisinisi faʻatau pisinisi lea e sau ai le talosaga, ma le igoa o le metotia poʻo le talosaga na amataina ai.

A maeʻa ona matou pasia le "tagata" o le talosaga, e tatau ona tuʻuina atu i le ogalaau - mo lenei mea matou te faʻatulagaina le fesuiaiga log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Mo i latou e fiafia, atonu vaai i le tusi lesonao le a le uiga o ia mea uma. E foliga mai tatou te vaʻai i le ogalaau:

  • время
  • fa'agasologa ma fefa'ataua'iga e iloagofie ai
  • igoa fa'amaumauga
  • IP o le tagata na auina mai lenei talosaga
  • ma le igoa metotia

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ona matou iloa ai lea e le o se mea manaia tele le vaʻai i le faʻamaopoopoina mo le tasi talosaga i le va o 'auʻaunaga eseese. E le masani ona i ai sau tulaga e tasi le talosaga e faʻafefe tutusa iinei ma iina. Ae tusa lava pe tutusa, vaʻai i soʻo se tasi o nei 'auʻaunaga.

O lea la o le tipi "tasi le server - tasi le aso" na foliga mai ua lava mo i matou mo soʻo se auiliiliga.

O le vaega muamua su'esu'e e tutusa "fa'ata'ita'iga" - o se fa'apu'upu'u fa'aaliga o le fuafuaga, fa'amama mai fa'ailoga numera uma. O le tipi lona lua o le talosaga poʻo le metotia, ma o le tipi lona tolu o le node o le fuafuaga faʻapitoa na mafua ai ona matou faʻafitauli.

Ina ua matou siitia mai tulaga patino i faʻataʻitaʻiga, matou te mauaina ni faʻamanuiaga se lua i le taimi e tasi:

  • fa'aitiitiga fa'atele i le aofa'i o mea mo su'esu'ega
    E tatau ona tatou iloiloina le faʻafitauli e le o toe faitau afe o fesili poʻo fuafuaga, ae o le tele o faʻataʻitaʻiga.
  • fa'asologa o taimi
    O lona uiga, e ala i le otootoina o "mea moni" i totonu o se vaega patino, e mafai ona e faʻaalia o latou foliga i le aso. Ma o iinei e mafai ona e malamalama ai afai e iai sau ituaiga mamanu e tupu, mo se faʻataʻitaʻiga, tasi i le itula, ae tatau ona tupu tasi i le aso, e tatau ona e mafaufau i le mea na tupu - o ai na mafua ai ma pe aisea, atonu e tatau ona i ai iinei e le tatau. O le isi lea e le fa'anumera, mama va'ai, metotia o au'ili'iliga.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

O isi metotia e faʻavae i luga o faʻailoga tatou te maua mai le fuafuaga: e fia taimi na tupu ai se faʻataʻitaʻiga, o le aofaʻi ma le averesi taimi, o le a le tele o faʻamatalaga na faitau mai le disk, ma le tele mai le manatua...

Aua, mo se faʻataʻitaʻiga, e te sau i le itulau auʻiliʻili mo le talimalo, vaʻai - o se mea ua amata ona faitau tele i luga o le disk. E le mafai e le tisiki i luga o le server ona taulimaina - o ai e faitau mai ai?

Ma e mafai ona e faʻavasegaina i soʻo se koluma ma filifili pe o le a le mea o le a e feagai i le taimi nei - o le uta i luga o le processor poʻo le disk, poʻo le aofaʻi o numera o talosaga... Na matou faʻavasegaina, vaʻai i le "pito i luga", faʻapipiʻi ma fa'asalalauina se fa'aaliga fou o le talosaga.
[video lauga]

Ma vave lava e mafai ona e vaʻai i talosaga eseese e oʻo mai ma le faʻataʻitaʻiga tutusa mai se talosaga e pei o SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... Ma e te mafaufau pe aisea e faitau ai le tagata faʻaoga pe a le fegalegaleai ma ia.

O le auala faʻafeagai o le vaʻaia vave mai le faʻaoga mea e fai. Mo se faʻataʻitaʻiga, o le pito i luma o le mea lenei, o le mea lea, o le mea lea, ma le tasi i le itula (fesoasoani le taimi). Ma o le fesili e vave ona tulaʻi mai: e foliga mai e le o se galuega a le pito i luma le faia o se mea e tasi i le itula ...

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ina ua mavae sina taimi, na matou iloa ai ua matou le maua se tuufaatasiga fuainumera e ala i nodes fuafuaga. Matou te vavaeeseina mai fuafuaga naʻo na pona e faia se mea i faʻamaumauga o laulau latou lava (faitau / tusi i le faʻasino pe leai). O le mea moni, naʻo le tasi le itu e faʻaopoopoina e faʻatatau i le ata muamua - e fia faamaumauga na aumai e lenei node ia i tatou?, ma le to'afia na lafoa'i (Rows Removed by Filter).

E leai sau fa'ailoga talafeagai i luga o le ipu, e te faia se talosaga i ai, e lele i tua atu o le fa'ailoga, e pa'u i le Seq Scan... ua e fa'amama uma fa'amaumauga vagana ai le tasi. Aisea e te manaʻomia ai le 100M faʻamaumauga faʻamaonia i le aso? E le sili atu ea le taʻavale i luga o le faasino igoa?

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

Ina ua uma ona suʻesuʻeina fuafuaga uma i le node, na matou iloa ai o loʻo i ai ni fausaga masani i totonu o fuafuaga e foliga mai e masalomia. Ma e manaia le taʻu atu i le atiaʻe: "Uo, o iinei e te faitau muamua i le faasino igoa, ona faʻavasega lea, ona tipi ese lea" - o se tulafono, e tasi le faʻamaumauga.

O tagata uma na tusia ni fesili atonu na feagai ma lenei mamanu: "Tuu mai ia te aʻu le poloaiga mulimuli mo Vasya, lona aso." Ma afai e leai sau faʻamatalaga i le aso, pe leai se aso i le faasino igoa na e faʻaaogaina, ona e laa i luga tonu lava o le "rake" tutusa.

Ae matou te iloa o le "rake" lea - o le a le mea e te le taʻu vave atu ai i le atinaʻe le mea e tatau ona ia faia. E tusa ai, pe a tatalaina se fuafuaga i le taimi nei, e vave ona vaʻaia e le matou atinaʻe se ata matagofie ma faʻamatalaga, lea latou te vave taʻu atu ai ia te ia: "E i ai au faʻafitauli iinei ma iina, ae ua foia i lea auala ma lena auala."

O se taunuuga, o le aofaʻi o le poto masani na manaʻomia e foia ai faʻafitauli i le amataga ma o le taimi nei ua paʻu tele. O le ituaiga meafaigaluega lea ua tatou maua.

Fa'atonuga tele o fesili a PostgreSQL. Kirill Borovikov (Tensor)

puna: www.habr.com

Faaopoopo i ai se faamatalaga