Messenger Datebank (Deel 2): ​​Partitionéiere "fir Gewënn"

Mir hunn d'Struktur vun eiser PostgreSQL Datebank erfollegräich entwéckelt fir Korrespondenz ze späicheren, e Joer ass vergaangen, d'Benotzer fëllen se aktiv aus, an elo enthält et Millioune records, an ... eppes huet ugefaang ze luesen.

Messenger Datebank (Deel 2): ​​Partitionéiere "fir Gewënn"
Punkt ass, datt Wéi d'Tabelle Gréisst wiisst, geet och d'"Déift" vun den Indexen. - wann och logarithmesch. Awer mat der Zäit forcéiert dëst de Server déiselwecht Lies- / Schreifaufgaben auszeféieren Prozess vill Mol méi Säiten vun Datenwéi am Ufank.

Dëst ass wou et zu der Rettung kënnt Sektiounen.

Loosst mech notéieren datt mir net iwwer Sharding schwätzen, dat heescht d'Verdeelung vun Daten tëscht verschiddenen Datenbanken oder Serveren. Well souguer d'Daten opdeelen an e puer Serveren, wäert Dir de Problem vun Index "Schwellung" iwwer Zäit net lass ginn. Et ass kloer datt wann Dir Iech leeschte kënnt, all Dag en neie Server a Betrib ze setzen, da wäerte Är Probleemer guer net méi am Fliger vun enger spezifescher Datebank leien.

Mir betruechten net spezifesch Scripte fir d'Ëmsetzung vun der Partition "an der Hardware", awer d'Approche selwer - wat a wéi soll "a Scheiwen geschnidden" ginn, a wat esou e Wonsch féiert.

Konzept

Loosst eis eist Zil nach eng Kéier definéieren: mir wëllen dofir suergen datt haut, muer an an engem Joer d'Quantitéit vun den Donnéeën, déi vu PostgreSQL gelies gëtt während all Lies-/Schreifoperatioun ongeféier d'selwecht bleift.

Fir all chronologesch cumuléiert Daten (Messagen, Dokumenter, Logbicher, Archiven, ...) déi natierlech Wiel als Partitionéierungsschlëssel ass Event Datum / Zäit. An eisem Fall ass esou en Event Moment fir de Message ze schécken.

Bedenkt datt Benotzer bal ëmmer schafft nëmme mat de "läscht". esou Donnéeën - si liesen déi lescht Messagen, analyséieren déi lescht Logbicher, ... Nee, natierlech, si kënne méi wäit zréck an d'Zäit scrollen, awer si maachen dat ganz seelen.

Vun dësen Aschränkungen ass et kloer datt déi optimal Messageléisung wier "deeglech" Rubriken - schliisslech wäert eise Benotzer bal ëmmer liesen wat him "haut" oder "gëschter" komm ass.

Wa mir am Dag bal nëmmen an engem Abschnitt schreiwen a liesen, da gëtt dat och méi efficace Notzung vun Erënnerung an Scheif - well all Sektiounsindexe einfach an de RAM passen, am Géigesaz zu de "grouss a fett" am ganzen Dësch.

Schrëtt fir Schrëtt

Am Allgemengen, kléngt alles uewendriwwer wéi ee kontinuéierleche Gewënn. An et ass erreechbar, awer dofir musse mir schwéier probéieren - well d'Entscheedung fir eng vun den Entitéiten ze partizipéieren féiert zum Besoin fir d'assoziéiert ze "gesinn"..

Message, seng Eegeschaften a Projektiounen

Well mir décidéiert hunn Messagen no Datumen ze schneiden, mécht et Sënn och d'Entitéite-Eegeschaften opzedeelen, déi dovun ofhänken (befestegt Dateien, Lëscht vun den Empfänger), an och vum Datum vum Message.

Zënter enger vun eisen typeschen Aufgaben ass präzis Messageregisteren ze gesinn (ongelies, erakommen, alles), ass et och logesch fir se "zeechnen" an d'Partitionéierung no Message Datumen.

Messenger Datebank (Deel 2): ​​Partitionéiere "fir Gewënn"

Mir addéieren de Partitionéierungsschlëssel (Messagedatum) op all Dëscher: Empfänger, Datei, Registry. Dir musst et net an de Message selwer addéieren, awer benotzt déi existent DateTime.

Themen

Well et nëmmen een Thema fir e puer Messagen ass, ass et kee Wee fir et am selwechte Modell ze "schneiden"; Dir musst op eppes anescht vertrauen. An eisem Fall ass et ideal Datum vum éischte Message an der Korrespondenz - dat ass de Moment vun der Schafung, tatsächlech, vum Thema.

Messenger Datebank (Deel 2): ​​Partitionéiere "fir Gewënn"

Füügt de Partitionéierungsschlëssel (Thema Datum) op all Dëscher: Thema, Participant.

Awer elo hu mir zwee Probleemer gläichzäiteg:

  • A wéi enger Rubrik soll ech no Messagen zum Thema sichen?
  • A wéi enger Rubrik soll ech d'Thema aus dem Message sichen?

Mir kënnen selbstverständlech weider an all Sektiounen sichen, awer dëst wäert ganz traureg sinn a wäert all eise Gewënn negéieren. Dofir, fir ze wësse wou genau kucken, wäerte mir logesch Linken / Hiweiser op Sektiounen maachen:

  • mir addéieren am Message Thema Datum Feld
  • loosst eis zum Thema addéieren Message Datum gesat dës Korrespondenz (kann eng separat Tabell sinn, oder eng Rei vun Datumen)

Messenger Datebank (Deel 2): ​​Partitionéiere "fir Gewënn"

Well et e puer Ännerungen un der Lëscht vun de Message Datumen fir all eenzel Korrespondenz ginn (schliisslech bal all Messagen falen op 1-2 ugrenzend Deeg), wäert ech op dës Optioun konzentréieren.

Am Ganzen huet d'Struktur vun eiser Datebank déi folgend Form gemaach, andeems d'Partitionéierung berücksichtegt gëtt:

Dëscher: RU, wann Dir eng Aversioun vum kyrillesche Alfabet an den Nimm vun Dëscher / Felder hutt, ass et besser net ze kucken

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

Spuert eng schéin Penny

Gutt, wat wa mir net benotzen klassesch Sektiounsoptioun baséiert op der Verdeelung vu Feldwäerter (duerch Ausléiser an Ierfschaft oder PARTITION BY), a "manuell" um Applikatiounsniveau, mierkt Dir datt de Wäert vum Partitionéierungsschlëssel schonn am Numm vun der Tabell selwer gespäichert ass.

Also wann Dir esou sidd Sidd Dir ganz besuergt iwwer d'Quantitéit un Daten déi gespäichert sinn?, da kënnt Dir dës "extra" Felder entgoen a spezifesch Dëscher adresséieren. True, all Selektiounen aus verschiddene Sektiounen an dësem Fall mussen op d'Applikatiounssäit transferéiert ginn.

Source: will.com

Setzt e Commentaire