I aso nei o le a leai ni faʻalavelave lavelave ma faʻapitoa algorithms i SQL. O mea uma o le a faigofie tele, i le tulaga o Kapeteni Obvious - tatou faia matamata i le resitala o mea na tutupu fa'avasega i le taimi.
O lona uiga, o loʻo i ai se faʻailoga i totonu o faʻamaumauga events
, ma e iai lona fanua ts
- o le taimi tonu tatou te mananaʻo e faʻaalia ai nei faʻamaumauga i se faiga faʻatonu:
CREATE TABLE events(
id
serial
PRIMARY KEY
, ts
timestamp
, data
json
);
CREATE INDEX ON events(ts DESC);
E manino lava o le a le maua ni a matou faamaumauga iina, o lea matou te manaʻomia ai se ituaiga folauga itulau.
#0. "O aʻu o loʻu tina pogromist"
cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);
E toetoe lava a le o se mea ula - e seasea, ae maua i le vao. O nisi taimi, pe a uma ona galue ma le ORM, e mafai ona faigata ona fesuiaʻi i le "saʻo" galuega ma SQL.
Ae se'i o tatou aga'i atu i fa'afitauli masani ma fa'aletonu.
#1. FA'AFIA
SELECT
...
FROM
events
ORDER BY
ts DESC
LIMIT 26 OFFSET $1; -- 26 - записей на странице, $1 - начало страницы
O fea na sau ai le numera 26? Ole numera fa'atatau lea o fa'amaumauga e fa'atumu ai le lau e tasi. E sili atu le saʻo, 25 faʻaalia faamaumauga, faʻatasi ai ma le 1, faʻailoga o loʻo i ai se isi mea e sili atu i le faʻataʻitaʻiga ma e talafeagai le faʻaauau.
Ioe, o lenei tau e le mafai ona "su'iina" i totonu o le tino o le talosaga, ae pasia se parakalafa. Ae i lenei tulaga, o le a le mafai e le PostgreSQL scheduler ona faʻalagolago i le malamalama e tatau ona i ai ni nai faʻamaumauga - ma o le a faigofie ona filifili se fuafuaga le aoga.
Ma aʻo iai i totonu o le faʻaoga faʻaoga, o le vaʻavaʻai i le resitala e faʻatinoina e pei o le fesuiaiga i le va o "itulau" vaaia, e leai se tasi na te matauina se mea masalosalo mo se taimi umi. Seʻia oʻo lava i le taimi, i le tauiviga mo le faʻaogagofie, ua filifili UI / UX e toe faʻaleleia le atinaʻe i le "taʻavale e le gata" - o lona uiga, o faʻamaumauga uma o le resitala e tusia i se lisi e tasi e mafai e le tagata faʻaoga ona taʻavale i luga ma lalo.
Ma o lea, i le isi suʻega, ua maua oe kopiina o faamaumauga i le resitala. Aisea, ona o le laulau o loʻo i ai se faʻailoga masani (ts)
, o fea e fa'alagolago iai lau fesili?
E tonu ona e te leʻi amanaia lena mea ts
e le o se ki tulaga ese i lenei laulau. O le mea moni, ma e le tulaga ese ona tau, pei o so'o se "taimi" i tulaga moni - o le mea lea, o le fa'amaumauga tutusa i fesili e lua e sosoo ai e faigofie lava ona "oso" mai lea itulau i lea itulau ona o se fa'atonuga mulimuli e ese i totonu o le fa'avae o le fa'avasegaina o le tau autu tutusa.
O le mea moni, o loʻo i ai foi se faʻafitauli lona lua o loʻo natia iinei, lea e sili atu ona faigata ona matauina - o nisi fa'amatalaga o le a le fa'aalia o na uma lava! A uma mea uma, o faʻamaumauga "faʻalua" na ave i se isi tagata. E mafai ona maua se faʻamatalaga auiliili ma ata matagofie
Faalautele le faasinoupu
E malamalama se tagata poto poto e manaʻomia ona faʻapitoa le faʻasino igoa, ma o le auala pito sili ona faigofie o le faʻalauteleina lea i se tulaga tulaga ese, lea PK e lelei mo:
CREATE UNIQUE INDEX ON events(ts DESC, id DESC);
Ma e suia le talosaga:
SELECT
...
ORDER BY
ts DESC, id DESC
LIMIT 26 OFFSET $1;
#2. Su'e i "cursors"
I se taimi mulimuli ane, e sau se DBA ia te oe ma e "fiafia" i au talosaga
SELECT
...
WHERE
(ts, id) < ($1, $2) -- последние полученные на предыдущем шаге значения
ORDER BY
ts DESC, id DESC
LIMIT 26;
Na e mānavaina se mapuea o le toomaga seia oo mai...
#3. Fa'amama fa'ailoga
Aua i se tasi aso na faitau lau DBA (ts DESC)
.
Ae o le a le mea e fai i le faʻafitauli muamua o le "osooso" faʻamaumauga i le va o itulau?.. Ma o mea uma e faigofie - e tatau ona e filifilia poloka ma se numera le tumau o faamaumauga!
I se tulaga lautele, o ai e faʻasaina i tatou e le faitau "saʻo 26", ae "ia le itiiti ifo i le 26"? Mo se faʻataʻitaʻiga, ina ia i ai i le isi poloka fa'amaumauga e manino le eseese o uiga ts
- ona leai lea o se faʻafitauli i faʻamaumauga "oso" i le va o poloka!
O le auala lenei e ausia ai lenei mea:
SELECT
...
WHERE
ts < $1 AND
ts >= coalesce((
SELECT
ts
FROM
events
WHERE
ts < $1
ORDER BY
ts DESC
LIMIT 1 OFFSET 25
), '-infinity')
ORDER BY
ts DESC;
O le a le mea o tupu iinei?
- Matou te laa 25 faʻamaumauga "i lalo" ma maua le tau o le "tuaoi".
ts
. - Afai e leai se mea iina, ona sui lea o le tau NULL i
-infinity
. - Matou te toesea le vaega atoa o tau i le va o le tau na maua
ts
ma le $1 parakalafa pasi mai le atinaʻe (o le "mulimuli" na tuʻuina atu le tau). - Afai e toe faafoi se poloka e itiiti ifo i le 26 faamaumauga, o le mea mulimuli lea.
Po o le ata lava lea e tasi:
Aua o lea ua tatou maua ole fa'ata'ita'iga e leai se "amataga" fa'apitoa, ona leai lea o se mea e taofia ai i tatou mai le "faʻalauteleina" lenei talosaga i le isi itu ma le faʻatinoina o le utaina malosi o poloka faʻamaumauga mai le "faʻasinomaga" i itu uma e lua - i lalo ma luga.
Manatua
- Ioe, i lenei tulaga tatou te maua le faasino igoa faalua, ae o mea uma e "mama i le faasino igoa". O le mea lea, o se subquery o le a naʻo le iʻuga i le tasi fa'aopoopo Fa'asinomaga Na'o le Va'aiga.
- E matua manino lava o lenei metotia e mafai ona faʻaaogaina pe a iai sau faʻatauga
ts
e mafai ona sopoia na o se avanoa, ma e le toatele i latou. Afai o lau mataupu masani o le "miliona faamaumauga i le 00:00:00.000", e le tatau ona e faia lenei mea. Ou te fai atu, e le tatau ona e faatagaina se tulaga faapena e tupu. Ae afai e tupu lenei mea, faʻaaoga le filifiliga ma se faʻamatalaga faʻalautele.
puna: www.habr.com