MÄs esam veiksmÄ«gi izstrÄdÄjuÅ”i mÅ«su PostgreSQL datu bÄzes struktÅ«ru korespondences glabÄÅ”anai, pagÄjis gads, lietotÄji to aktÄ«vi aizpilda, un tagad tajÄ ir miljoniem ierakstu, un... kaut kas sÄka palÄninÄties.
- 2. daļa: iedalÄ«jums āpeļÅas gūŔanaiā

Fakts ir tÄds, ka Pieaugot tabulas lielumam, pieaug arÄ« indeksu ādziļumsā. - kaut arÄ« logaritmiski. Bet laika gaitÄ tas liek serverim veikt tos paÅ”us lasīŔanas/rakstīŔanas uzdevumus apstrÄdÄt daudzkÄrt vairÄk datu lapunekÄ sÄkumÄ.
Å eit tas nÄk palÄ«gÄ sadalīŔana.
Ä»aujiet man atzÄ«mÄt, ka mÄs nerunÄjam par sadalīŔanu, tas ir, datu sadali starp dažÄdÄm datu bÄzÄm vai serveriem. Jo pat sadalot datus uz daži serveriem, jÅ«s neatbrÄ«vosities no indeksu āuzbrieÅ”anasā problÄmas laika gaitÄ. Skaidrs, ka, ja katru dienu vari atļauties nodot ekspluatÄcijÄ jaunu serveri, tad tavas problÄmas vairs nemaz neslÄpsies konkrÄtas datu bÄzes plaknÄ.
MÄs apsvÄrsim nevis konkrÄtus skriptus sadalīŔanas ievieÅ”anai āaparatÅ«rÄā, bet gan paÅ”u pieeju - ko un kÄ vajadzÄtu āsagriezt ŔķÄlÄsā, un pie kÄ noved Å”Äda vÄlme.
Koncepcija
VÄlreiz definÄsim savu mÄrÄ·i: mÄs vÄlamies pÄrliecinÄties, ka Å”odien, rÄ«t un pÄc gada PostgreSQL nolasÄ«to datu apjoms jebkuras lasīŔanas/rakstīŔanas darbÄ«bas laikÄ paliek aptuveni tÄds pats.
Jebkuram hronoloÄ£iski uzkrÄtie dati (ziÅojumi, dokumenti, žurnÄli, arhÄ«vi, ...) kÄ sadalīŔanas atslÄga ir dabiska izvÄle notikuma datums/laiks. MÅ«su gadÄ«jumÄ Å”Äds pasÄkums ir ziÅas nosÅ«tīŔanas brÄ«dis.
Å emiet vÄrÄ, ka lietotÄji gandrÄ«z vienmÄr strÄdÄt tikai ar ājaunÄkajiemā. tÄdi dati - viÅi lasa jaunÄkos ziÅojumus, analizÄ jaunÄkos žurnÄlus,... NÄ, protams, viÅi var ritinÄt laiku atpakaļ, bet viÅi to dara ļoti reti.
No Å”iem ierobežojumiem ir skaidrs, ka optimÄlais ziÅojuma risinÄjums bÅ«tu "ikdienas" sadaļas - galu galÄ mÅ«su lietotÄjs gandrÄ«z vienmÄr lasÄ«s to, kas viÅam nÄca āÅ”odienā vai āvakarā.
Ja dienas laikÄ rakstÄm un lasÄm gandrÄ«z tikai vienÄ sadaļÄ, tad arÄ« tas mums dod efektÄ«vÄka atmiÅas un diska izmantoÅ”ana - jo visi sadaļu indeksi viegli iekļaujas operatÄ«vajÄ atmiÅÄ, atŔķirÄ«bÄ no "lielajiem un resnajiem" visÄ tabulÄ.
soli pa solim
KopumÄ viss iepriekÅ” teiktais izklausÄs pÄc vienas nepÄrtrauktas peļÅas. Un tas ir sasniedzams, bet mums bÅ«s smagi jÄcenÅ”as - jo lÄmums sadalÄ«t vienu no entÄ«tijÄm noved pie nepiecieÅ”amÄ«bas āzÄÄ£Ätā saistÄ«to.
ZiÅojums, tÄ Ä«paŔības un projekcijas
TÄ kÄ mÄs nolÄmÄm sagriezt ziÅojumus pÄc datumiem, ir lietderÄ«gi sadalÄ«t arÄ« entÄ«tijas-rekvizÄ«tus, kas ir atkarÄ«gi no tiem (pievienotie faili, adresÄtu saraksts) un arÄ« pÄc ziÅojuma datuma.
TÄ kÄ viens no mÅ«su tipiskajiem uzdevumiem ir precÄ«za ziÅojumu reÄ£istru apskate (nelasÄ«tie, ienÄkoÅ”ie, visi), ir arÄ« loÄ£iski tos āievilktā sadalīŔanÄ pÄc ziÅojumu datumiem.

MÄs pievienojam sadalīŔanas atslÄgu (ziÅojuma datumu) visÄm tabulÄm: adresÄti, fails, reÄ£istri. Jums tas nav jÄpievieno paÅ”am ziÅojumam, bet jÄizmanto esoÅ”ais DateTime.
TÄmas
TÄ kÄ vairÄkiem ziÅojumiem ir tikai viena tÄma, to nevar āsagrieztā vienÄ modelÄ«, ir jÄpaļaujas uz kaut ko citu. MÅ«su gadÄ«jumÄ tas ir ideÄls pirmÄs ziÅas datums sarakstÄ ā tas ir, tÄmas radīŔanas brÄ«dis.

Pievienojiet sadalīŔanas atslÄgu (tÄmas datumu) visÄm tabulÄm: tÄma, dalÄ«bnieks.
Bet tagad mums ir divas problÄmas vienlaikus:
- KurÄ sadaÄ¼Ä meklÄt ziÅas par tÄmu?
- KurÄ sadaÄ¼Ä man meklÄt tÄmu no ziÅojuma?
MÄs, protams, varam turpinÄt meklÄÅ”anu visÄs sadaļÄs, taÄu tas bÅ«s ļoti skumji un atteiks visus mÅ«su laimestus. TÄpÄc, lai zinÄtu, kur tieÅ”i meklÄt, izveidosim loÄ£iskas saites/norÄdes uz sadaļÄm:
- pievienosim vÄstulÄ tÄmas datuma lauks
- papildinÄsim tÄmu iestatÄ«ts ziÅojuma datums Ŕī sarakste (var bÅ«t atseviŔķa tabula vai datumu masÄ«vs)

TÄ kÄ katrai atseviŔķai sarakstei ziÅojumu datumu sarakstÄ bÅ«s maz modifikÄciju (galu galÄ gandrÄ«z visas ziÅas iekrÄ«t 1-2 blakus dienÄs), es pievÄrsīŔos Å”ai opcijai.
KopumÄ mÅ«su datu bÄzes struktÅ«ra bija Å”Äda, Åemot vÄrÄ sadalīŔanu:
Tabulas: RU, ja jums ir nepatika pret kirilicas alfabÄtu tabulu/lauku nosaukumos, labÄk neskatÄ«ties
-- ŃŠµŠŗŃŠøŠø по Š“Š°ŃŠµ ŃŠ¾Š¾Š±ŃениŃ
CREATE TABLE "Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ_YYYYMMDD"(
"Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ"
uuid
PRIMARY KEY
, "Тема"
uuid
, "ŠŠ°ŃаТемŃ"
date
, "ŠŠ²ŃоŃ"
uuid
, "ŠŠ°ŃаŠŃемŃ" -- ŠøŃŠæŠ¾Š»ŃŠ·Ńем как ГаŃŃ
timestamp
, "ТекŃŃ"
text
);
CREATE TABLE "ŠŠ“ŃŠµŃаŃ_YYYYMMDD"(
"ŠŠ°ŃŠ°Š”Š¾Š¾Š±ŃŠµŠ½ŠøŃ"
date
, "Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ"
uuid
, "ŠŠµŃŃŠ¾Š½Š°"
uuid
, PRIMARY KEY("Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ", "ŠŠµŃŃŠ¾Š½Š°")
);
CREATE TABLE "Файл_YYYYMMDD"(
"ŠŠ°ŃŠ°Š”Š¾Š¾Š±ŃŠµŠ½ŠøŃ"
date
, "Файл"
uuid
PRIMARY KEY
, "Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ"
uuid
, "BLOB"
uuid
, "ŠŠ¼Ń"
text
);
CREATE TABLE "РееŃŃŃŠ”Š¾Š¾Š±ŃŠµŠ½ŠøŠ¹_YYYYMMDD"(
"ŠŠ°ŃŠ°Š”Š¾Š¾Š±ŃŠµŠ½ŠøŃ"
date
, "ŠŠ»Š°Š“елеŃ"
uuid
, "ТипРееŃŃŃŠ°"
smallint
, "ŠŠ°ŃаŠŃемŃ"
timestamp
, "Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ"
uuid
, PRIMARY KEY("ŠŠ»Š°Š“елеŃ", "ТипРееŃŃŃŠ°", "Š”Š¾Š¾Š±ŃŠµŠ½ŠøŠµ")
);
CREATE INDEX ON "РееŃŃŃŠ”Š¾Š¾Š±ŃŠµŠ½ŠøŠ¹_YYYYMMDD"("ŠŠ»Š°Š“елеŃ", "ТипРееŃŃŃŠ°", "ŠŠ°ŃаŠŃемŃ" DESC);
-- ŃŠµŠŗŃŠøŠø по Š“Š°ŃŠµ ŃŠµŠ¼Ń
CREATE TABLE "Тема_YYYYMMDD"(
"ŠŠ°ŃаТемŃ"
date
, "Тема"
uuid
PRIMARY KEY
, "ŠŠ¾ŠŗŃменŃ"
uuid
, "ŠŠ°Š·Š²Š°Š½ŠøŠµ"
text
);
CREATE TABLE "Š£ŃŠ°ŃŃŠ½ŠøŠŗŠ¢ŠµŠ¼Ń_YYYYMMDD"(
"ŠŠ°ŃаТемŃ"
date
, "Тема"
uuid
, "ŠŠµŃŃŠ¾Š½Š°"
uuid
, PRIMARY KEY("Тема", "ŠŠµŃŃŠ¾Š½Š°")
);
CREATE TABLE "ŠŠ°ŃŃŠ”Š¾Š¾Š±ŃŠµŠ½ŠøŠ¹Š¢ŠµŠ¼Ń_YYYYMMDD"(
"ŠŠ°ŃаТемŃ"
date
, "Тема"
uuid
PRIMARY KEY
, "ŠŠ°Ńа"
date
);
Ietaupiet diezgan santīmu
Nu, ja mÄs neizmantojam pamatojoties uz lauka vÄrtÄ«bu sadalÄ«jumu (izmantojot trigerus un mantojumu vai PARTITION BY) un āmanuÄliā lietojumprogrammas lÄ«menÄ«, pamanÄ«sit, ka sadalīŔanas atslÄgas vÄrtÄ«ba jau ir saglabÄta paÅ”as tabulas nosaukumÄ.
TÄtad, ja jÅ«s tÄ esat Vai jÅ«s ļoti uztrauc saglabÄto datu apjoms?, tad varat atbrÄ«voties no Å”iem āpapilduā laukiem un adresÄt konkrÄtas tabulas. Tiesa, visas atlases no vairÄkÄm sadaļÄm Å”ajÄ gadÄ«jumÄ bÅ«s jÄpÄrnes uz pieteikuma pusi.
Avots: www.habr.com
