Baz done Messenger (pati 2): patisyon "pou pwofi"

Nou te fèt avèk siksè estrikti baz done PostgreSQL nou an pou estoke korespondans, gen yon ane pase, itilizatè yo aktivman ranpli li, epi kounye a li gen ladan l. dè milyon de dosye, ak... yon bagay te kòmanse ralanti.

Baz done Messenger (pati 2): patisyon "pou pwofi"
Reyalite se ke Kòm gwosè tab la ap grandi, se konsa tou "pwofondè" nan endèks yo. - kwake logaritmik. Men, apre yon tan, sa a fòse sèvè a fè menm travay lekti/ekri yo trete anpil fwa plis paj donepase nan kòmansman an.

Sa a se kote li rive sekou seksyon.

Kite m 'remake ke nou pa pale sou sharding, se sa ki, distribye done ant baz done diferan oswa sèvè. Paske menm divize done yo an kèk sèvè, ou pa pral debarase m de pwoblèm nan nan endèks "anfle" sou tan. Li klè ke si ou gen mwayen pou mete yon nouvo sèvè nan operasyon chak jou, Lè sa a, pwoblèm ou yo pa pral kouche nan tout plan an nan yon baz done espesifik.

Nou pral konsidere pa scripts espesifik pou aplike patisyon "nan pyès ki nan konpitè", men apwòch nan tèt li - ki sa ak ki jan yo ta dwe "koupe an tranch", ak kisa yon dezi konsa mennen nan.

Konsèp

Ann defini objektif nou yon lòt fwa ankò: nou vle asire w ke jodi a, demen, ak nan yon ane, kantite done PostgreSQL li pandan nenpòt operasyon lekti/ekri rete apeprè menm.

Pou nenpòt ki done akimile kwonolojik (mesaj, dokiman, mòso bwa, achiv, ...) chwa natirèl la kòm yon kle partition se dat/lè evènman an. Nan ka nou an, yon evènman konsa se moman pou voye mesaj la.

Remake byen ke itilizatè yo prèske toujou travay sèlman ak "dènye" yo done sa yo - yo li dènye mesaj yo, analize dènye mòso bwa yo,... Non, nan kou, yo ka woule pi lwen tounen nan tan, men yo fè sa trè raman.

Soti nan kontrent sa yo li klè ke solisyon an mesaj optimal ta dwe seksyon "chak jou". - Apre yo tout, itilizatè nou an pral prèske toujou li sa ki te vin jwenn li "jodi a" oswa "yè".

Si nou ekri ak li prèske sèlman nan yon seksyon pandan jounen an, Lè sa a, sa a tou ba nou itilizasyon pi efikas nan memwa ak disk - Piske tout endèks seksyon yo anfòm fasilman nan RAM la, kontrèman ak "gwo ak gra" yo nan tout tab la.

pa za pa

An jeneral, tout sa ki di pi wo a son tankou yon sèl pwofi kontinyèl. Epi li se possible, men pou sa a nou pral oblije eseye di - paske desizyon an patisyon youn nan antite yo mennen nan bezwen nan "wè" ki asosye yo.

Mesaj, pwopriyete li yo ak pwojeksyon

Piske nou te deside koupe mesaj yo pa dat, li fè sans tou divize antite-pwopriyete ki depann de yo (fichye tache, lis moun k ap resevwa), epi tou pa dat mesaj la.

Piske youn nan travay tipik nou yo se jisteman gade rejis mesaj (ki pa li, k ap rantre, tout), li lojik tou pou "desine yo nan" nan patisyon pa dat mesaj yo.

Baz done Messenger (pati 2): patisyon "pou pwofi"

Nou ajoute kle patisyon an (dat mesaj) nan tout tab: moun k ap resevwa, dosye, rejis. Ou pa bezwen ajoute li nan mesaj la tèt li, men sèvi ak DateTime ki egziste deja.

Sijè

Depi gen yon sèl sijè pou plizyè mesaj, pa gen okenn fason pou "koupe" li nan menm modèl la; ou dwe konte sou yon lòt bagay. Nan ka nou an, li se ideyal dat premye mesaj nan korespondans — se sa ki, moman kreyasyon an, an reyalite, nan sijè a.

Baz done Messenger (pati 2): patisyon "pou pwofi"

Ajoute kle patisyon an (dat sijè) nan tout tab: sijè, patisipan.

Men koulye a, nou gen de pwoblèm nan yon fwa:

  • Nan ki seksyon mwen ta dwe chèche mesaj sou sijè a?
  • Nan ki seksyon mwen ta dwe chèche sijè a nan mesaj la?

Nou ka, nan kou, kontinye rechèch nan tout seksyon, men sa a pral tris anpil epi yo pral anile tout gaye nou yo. Se poutèt sa, yo nan lòd yo konnen ki kote egzakteman yo gade, nou pral fè lyen lojik / endikasyon nan seksyon:

  • nou pral ajoute nan mesaj la jaden dat sijè
  • ann ajoute nan sijè a dat mesaj la fikse korespondans sa a (kapab yon tab separe, oswa yon etalaj de dat)

Baz done Messenger (pati 2): patisyon "pou pwofi"

Piske pral gen kèk modifikasyon nan lis dat mesaj yo pou chak korespondans endividyèl (apre tou, prèske tout mesaj tonbe sou 1-2 jou adjasan), mwen pral konsantre sou opsyon sa a.

An total, estrikti baz done nou an te pran fòm sa a, pran an kont patisyon:

Tablo: RU, si ou gen yon degoutans pou alfabè a sirilik nan non tab yo / jaden, li pi bon pa gade.

-- секции по дате сообщения
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
);

Sove yon bèl pyès lajan

Oke, e si nou itilize pa opsyon seksyon klasik ki baze sou distribisyon an nan valè jaden (atravè deklanche ak eritaj oswa PARTITION BY), ak "manyèlman" nan nivo aplikasyon an, ou pral remake ke valè a nan kle patisyon an deja estoke nan non tab la tèt li.

Se konsa, si ou se konsa Èske ou trè enkyete w sou kantite done ki estoke?, Lè sa a, ou ka debarase m de jaden "siplemantè" sa yo epi adrese tab espesifik. Se vre, tout seleksyon ki soti nan plizyè seksyon nan ka sa a pral oblije transfere sou bò aplikasyon an.

Sous: www.habr.com

Add nouvo kòmantè