Messenger datu bāze (2. daļa): sadalīŔana ā€œpeļņas nolÅ«kosā€

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.

Messenger datu bāze (2. daļa): sadalīŔana ā€œpeļņas nolÅ«kosā€
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.

Messenger datu bāze (2. daļa): sadalīŔana ā€œpeļņas nolÅ«kosā€

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.

Messenger datu bāze (2. daļa): sadalīŔana ā€œpeļņas nolÅ«kosā€

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)

Messenger datu bāze (2. daļa): sadalīŔana ā€œpeļņas nolÅ«kosā€

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 klasiskā sadalīŔanas iespēja 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

Iegādājieties uzticamu mitināŔanu vietnēm ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa vietņu mitināŔanu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster