ááá±á· SQL ááœááºááŸá¯ááºááœá±ážáá±á¬ááá á¹á áá»á¬ážááŸáá·áºáá±ááºáá®áá±á¬ algorithms áá»á¬ážááŸááááºááá¯ááºáá«á Captain áááá¬áááºááŸá¬ážáá²á·á¡ááá·áºááŸá¬ á¡áá¬á¡á¬ážáá¯á¶ážá á¡áááºážááá¯ážááŸááºážáá«áááá·áºááẠ- á¡á²áá«ááᯠáá¯ááºááŒáá¡á±á¬áẠevent registry ááá¯ááŒáá·áºááŸá¯ááŒááºážá á¡áá»áááºá¡á¬ážááŒáá·áº á á®áá¬ážáááºá
ááá¯ááá¯áááºááŸá¬ áá±áá¬áá±á·á
áºááœáẠááá¯ááºážáá¯ááºáá
áºáá¯ááŸááááºá events
ááŒá®ážáá±á¬á· áá°áááŸá¬ áááºááœááºážáá
áºáá¯ááŸááááºá ts
- á€ááŸááºáááºážáá»á¬ážááᯠá
áá
áºááá»ááŒáááá¯ááá·áºá¡áá»áááºá¡ááá¡áá»á
CREATE TABLE events(
id
serial
PRIMARY KEY
, ts
timestamp
, data
json
);
CREATE INDEX ON events(ts DESC);
á¡á²áá®ááŸá¬ ááŸááºáááºážáá áºáá«áááºáá±á¬áẠááŸáááŸá¬ááá¯ááºáá°ážááá¯áᬠááŸááºážáá«áááºá áá«ááŒá±á¬áá·áº áá¯á¶á á¶áá áºáá»áá¯ážáá»áá¯áž ááá¯á¡ááºáá«áááá·áºáááºá á á¬áá»ááºááŸá¬áááºážááœáŸááº.
#0á "áá«á áá«á·á¡áá±áá²á· á¡ááá¯ážááŒááºááá¬ážáá²"
cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);
áá¬áááá¯ááºáá±á¬ááºáá«áá°áž - ááŸá¬ážáá«ážáá±ááá·áº áá±á¬ááá¯ááºážáá²ááŸá¬ ááœá±á·ááááºá áá áºáá«áá áºáᶠORM ááŸáá·áºá¡áá¯ááºáá¯ááºááŒá®ážáá±á¬áẠSQL ááŸáá·áº "ááá¯ááºááá¯ááº" á¡áá¯ááºááá¯á·ááŒá±á¬ááºážááẠáááºáá²ááá¯ááºáááºá
áá«áá±ááá·áº ááá¯á¡ááŒá
áºáá»á¬ážááŒá®áž áá°áááááºážáá²á· ááŒá¿áá¬ááœá±ááᯠáááºááœá¬ážááŒáá·áºáá¡á±á¬ááºá
#áá á¡á±á¬á·ááºáááº
SELECT
...
FROM
events
ORDER BY
ts DESC
LIMIT 26 OFFSET $1; -- 26 - запОÑей Ма ÑÑÑаМОÑе, $1 - МаÑалП ÑÑÑаМОÑÑ
áá¶áá«áẠáá á áááºááá¬áá¬áá²á á€áááºááŸá¬ áááºáá¬ážááŒááºáá áºáá¯á¡á¬áž ááŒáá·áºááẠá¡áá®ážá ááºáá¯á¶áž á¡áá±á¡ááœááºááŒá áºáááºá ááá¯ááááá»áááºááŸá¬á ááŒááá¬ážáá±á¬ ááŸááºáááºáž 26 áᯠááŸáá·áº 25 ááẠááá°áá¬ááœáẠá¡áááºážáá¯á¶áž áá±á¬ááºááẠáá áºáá¯áᯠááŸááá±ááŒá±á¬ááºáž á¡áá»ááºááŒááŒá®áž ááŸá±á·áááºááẠá¡áááá¹áá¬áẠááŸááá«áááºá
áá¯ááºáá«áááºá áá®áááºááá¯ážááᯠáá±á¬ááºážááá¯ááŸá¯áá²á·ááá¯ááºáááºááŸá¬ âáá»á¯ááºâ ááá¯á· áááá«áá°ážá áá«áá±ááá·áº ááá·áºáááºáá»ááºáá áºáá¯ááᯠááŒááºáááºážáá«áááºá ááá¯á·áá±á¬áºá€ááá á¹á ááœááºá PostgreSQL á¡á á®á¡á ááºááœá²áá°ááẠááŸááºáááºážá¡áááºážáááºáá¬ááŸáááá·áºáááºáá°áá±á¬ á¡ááááá¬á¡áá±á«áº á¡á¬ážááá¯ážááá¯ááºáááºááá¯ááºáá± - áááá±á¬ááºááŸá¯áááŸááá±á¬á¡á á®á¡á ááºááᯠá¡ááœááºááá°ááœá±ážáá»ááºááá¯ááºáááºááŒá áºáááºá
á¡ááºááá®áá±ážááŸááºážáá»ááºááŸá¬ááŒááºááœááºááŸááá±á ááºá registry ááá¯ááŒáá·áºááŸá¯ááŒááºážááá¯ááŒááºáá¬áá±á¬â á á¬áá»ááºááŸá¬áá»á¬ážâ áá»á¬ážá¡ááŒá¬ážááŒá±á¬ááºážááŒááºážá¡ááŒá áºáá¯ááºáá±á¬ááºáááºá áááºáá°áá»áŸáá¶ááááŒá áºá áá¬ááá¯á¡ááŒá¬ááŒá®ážáááááá¬ážáááá«á á¡áááºááŒá±á á±áááºá¡ááœáẠáá¯ááºážáááºááŸá¯ááœáẠUI/UX ááẠá¡ááºáá¬áá±á·á áºááᯠ"á¡áá¯á¶ážáá²á· scroll" á¡ááŒá ẠááŒááºáááºáááºáá®ážááẠáá¯á¶ážááŒááºááẠ- ááá¯ááá¯áááºááŸá¬á á¡áá¯á¶ážááŒá¯áá°ááẠá¡áá±á«áºááŸáá·áºá¡á±á¬áẠááœáŸá±á·ááá¯ááºáá±á¬ á á¬áááºážáá áºáá¯áááºážááœáẠááŸááºáá¯á¶áááºááŒááºážá¡á¬ážáá¯á¶ážááᯠáá±ážááœá²áá¬ážáááºá
ááá¯á·ááŒá±á¬áá·áº áá±á¬ááºáá
áºááŒááẠá
ááºážáááºááŸá¯á¡ááœááºáž áááºááẠáááºážááááœá¬ážáááºááŒá
áºáááºá ááŸááºáááºážáá»á¬ážááœá¬ážááŒááºážá registry ááœááºá á¡ááá·áºááŒá±á¬áá·áºááá¯áá±á¬áº ááá¬ážááœáẠáá¯á¶ááŸááºá¡ááœáŸááºážáá
áºáá¯ááŸááááºá (ts)
áááºááá±ážááŒááºážáá»ááºááẠáááºááá·áºá¡áá¬ááᯠá¡á¬ážááá¯ážáá±ááááºážá
á¡á²áá«ááᯠáá±áá»á¬ ááá·áºáááœááºáá¬ážááá¯á·áá«á ts
áá°ážááŒá¬ážáá±á¬áá±á¬á·ááá¯ááºáá«á á€ááá¬ážáá ááááºáá±á¬á·á ááŸáá·áº áááºážááááºááá¯ážáá»á¬ážáááºáá°ážááŒá¬ážáááºááá¯ááºááááºááœá±á·á¡ááŒá±á¡áá±áá»á¬ážááœáẠáááºááá·áº "á¡áá»áááº" áá²á·ááá¯á·ááŒá
áºááẠ- ááá¯á·ááŒá±á¬áá·áºá áááºáá»ááºáá±ážááŒááºážáá»ááºááŸá
áºáá¯ááŸá áá°áá®áá±á¬ááŸááºáááºážááẠáá°áá®áá±á¬áá±á¬á·áááºááá¯ážááá¯á
á®áááºáá±á¬ááºá¡ááœááºáž ááá°áá®áá±á¬áá±á¬ááºáá¯á¶ážá¡ááŸá¬á
á¬áá
áºáá¯ááŒá±á¬áá·áº á
á¬áá»ááºááŸá¬áá
áºáá¯ááŸáá
áºáá¯ááá¯á· ááœááºáá°á
áœá¬ "áá¯ááº"ááœá¬ážáá«áááºá
ááááºáá±á¬á·á áá®áá±áá¬ááŸá¬ ááááá¬ážáááá¯áááºáá²á· áá¯áááááŒá¿áá¬áá
áºáá¯áááºáž ááŸááá«áá±ážáááºá á¡áá»áá¯á·áá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááŒááááºááá¯ááºáá«á áá¯á¶ážá! áá±á¬ááºáá¯á¶ážááœááºá "áááá¹áá°" ááŸááºáááºážáá»á¬ážááẠá¡ááŒá¬ážáá°áá
áºáŠážááá±áá¬ááá¯á· áá±á¬ááºááœá¬ážáá«áááºá ááŸááá±á¬áá¯á¶áá»á¬ážááŸáá·áºá¡áá° á¡áá±ážá
áááºááŸááºážáááºážáá»ááºááᯠááœá±á·ááá¯ááºáá«áááºá
á¡ááœáŸááºážááá¯áá»á²á·ááœááºááŒááºážá
áááá¹áá¬áá±á¬áá±á¬á·ááºáá²áá±ážáá¬ážáá°ááẠá¡ááœáŸááºážááááºážááᯠáá°ážááŒá¬ážá¡á±á¬ááºááŒá¯áá¯ááºááẠááá¯á¡ááºááŒá±á¬ááºáž áá¬ážáááºááá±á¬áá±á«ááºááŒá®áž á¡ááœááºáá¯á¶ážáááºážáááºážááŸá¬ PK á¡ááœáẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áááá¬áááºááŸá¬ážáá±á¬áá°ážááŒá¬ážáá±á¬áááºáááºáá áºáá¯ááŒáá·áº áááºážááá¯áá»á²á·ááœááºáááºááŒá áºáááº-
CREATE UNIQUE INDEX ON events(ts DESC, id DESC);
áá±á¬ááºážááá¯áá»ááºááẠááŒá±á¬ááºážáá²ááœá¬ážáááº-
SELECT
...
ORDER BY
ts DESC, id DESC
LIMIT 26 OFFSET $1;
#áá "áá¬áá¬áá»á¬áž" ááá¯á· ááŒá±á¬ááºážáá«
á¡áá»áááºá¡áááºážáááºááŒá¬áá±á¬á¡áá«á DBA ááẠááá·áºáá¶áá±á¬ááºáá¬ááŒá®áž ááá·áºáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠ"áá»á±áááº" áá«áááºá
SELECT
...
WHERE
(ts, id) < ($1, $2) -- пПÑлеЎМОе пПлÑÑеММÑе Ма пÑеЎÑÐŽÑÑеЌ Ñаге зМаÑеМОÑ
ORDER BY
ts DESC, id DESC
LIMIT 26;
áááºážáá±á¬ááºáá¬áá²á·á¡áá áááºááŒááºážáá áºáá»ááºáá»ááá¯ááºáááº...
#áá ááá·áºááŸááºážáá±ážá¡ááœáŸááºážáá»á¬áž
áá¬ááŒá±á¬áá·áºáá²ááá¯áá±á¬á· áá
áºáá±á·ááŸá¬ áááºážáá²á· DBA á áááºáááºá (ts DESC)
.
ááá¯á·áá±á¬áº á á¬áá»ááºááŸá¬áá»á¬ážááŒá¬ážááœáẠ"áá¯ááºááŒááºáž" ááŸááºáááºážáá»á¬ážá áááŠážááŒá¿áá¬ááŸáá·áº áááºááá¯á·áá¯ááºáá±á¬ááºááááºáááºážá á á¡áá¬á¡á¬ážáá¯á¶ážááẠááá¯ážááŸááºážáá«ááẠ- ááá±áááœááºááá¯ááºáá±á¬ ááŸááºáááºážá¡áá±á¡ááœááºááŒáá·áº ááááºááá¯á·ááŸá¯áá»á¬ážááᯠáááºááœá±ážáá»ááºáááºááá¯á¡ááºáá«áááºá
áá±áá°áá»á¡á¬ážááŒáá·áºá âáá á¡ááá¡áá»â ááá¯ááºáá² âáá áááºááááºážâ ááááºááá¯á· áááºáá°á áá¬ážááŒá
áºáá¬áá²á á¥ááá¬- áá«á០áá±á¬ááºááá±á¬ááºááŸá¬ ááŸááá¬á áááºááŸá¬ážá
áœá¬ááœá²ááŒá¬ážáá±á¬ á¡áááá¹áá«ááºáá»á¬ážááŒáá·áº ááŸááºáááºážáááºáá¬ážáááºá ts
- ááá¯á·áá±á¬áẠblocks áá»á¬ážááŒá¬ážááœáẠ"áá¯ááºááŒááºáž" ááŸááºáááºážáá»á¬ážááŸáá·áº ááŒá¿áá¬ááŸááááºááá¯ááºáá«á
áá«ááᯠá¡á±á¬ááºááŒááºá¡á±á¬áẠáááºááá¯áá¯ááºáááá²á
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;
áá®ááŸá¬áá¬ááœá±ááŒá áºáá±áá¬áá²?
- áá»áœááºá¯ááºááá¯á·ááẠá¡ááá·áº 25 ááᯠ"áááºáž" ááŸááºáááºážáááºááŒá®áž "áááºááááááº" áááºááá¯ážááá¯ááá°áá«á
ts
. - ááá¯áá±áá¬ááœáẠáá¬ááŸáááŸááá±ážáá«áá ááá¯á·áá±á¬áẠNULL áááºááá¯ážááᯠá¡á
á¬ážááá¯ážáá«á
-infinity
. - áá»áœááºá¯ááºááá¯á· áááºáá¶áááŸááá±á¬ áááºááá¯ážáá»á¬ážááŒá¬ážááŸá áááºááá¯ážáá»á¬áž á¡ááá¯ááºážáá
áºáá¯áá¯á¶ážááᯠáá¯ááºáá°áá«áááºá
ts
ááŸáá·áº $1 áá«áá¬áá®áá¬ááẠá¡ááºáá¬áá±á·á áºá០ááŒááºááœá¬ážááẠ(áááẠâáá±á¬ááºáá¯á¶ážâ ááŒááºááá¯áá¬ážáá±á¬ áááºááá¯áž)á - ááŸááºáááºáž 26 áááºáááºážáá±á¬ ááá±á¬ááºáá áºáá¯ááᯠááŒááºááá«áá áááºážááẠáá±á¬ááºáá¯á¶ážáá áºáá¯ááŒá áºáááºá
ááá¯á·ááá¯áẠáá°áá®áá±á¬áá¯á¶
áá¬ááá¯á·áá² ááá¯áá±á¬á· á¡áᯠáá«ááá¯á· ááŸááááºá ááá°áá¬ááœáẠáá®ážááŒá¬áž "á¡á " áááŸááá«áááá¯á·ááŒá±á¬áá·áº á€áá±á¬ááºážááá¯áá»ááºááᯠááá·áºáá»ááºáááºáŠážáááºáá»ááºááŒáá·áº âáá»á²á·ááœááºááŒááºážâ á០áá»áœááºá¯ááºááá¯á·á¡á¬áž áááºááá·áºá¡áá¬ááá»áŸ ááá·áºáá»ááºáááºáŠážáááºáá»ááºááŒáá·áº âááá¯ážáá¬ážáá»ááºá¡ááŸááºâ á០áááºážááŒá±á¬ááºážááŸá áºáá¯á áá¯á¶ážááœáẠâááá¯ážáá¬ážáá»ááºá¡ááŸááºâ á០áá±áá¬ááá±á¬ááºáá»á¬ážááᯠááá¯ááºážááá áºáááºááŒááºážá¡á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá០áá¬ážáá®ážáá¬ážáá«áááºá
ááœá±á¬ááá¯
- áá¯ááºáá²á·á á€á¡ááŒá±á¡áá±ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡ááœáŸááºážááᯠááŸá áºááŒáááºáááºáá±á¬ááºááŒáá·áºááŸá¯ááá¯ááºáá±á¬áºáááºáž á¡áá¬á¡á¬ážáá¯á¶ážááẠ"á¡ááœáŸááºážá¡á¬ážááŒáá·áºáá¬" ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá subquery áááºáᬠááááºááœááºáá¬áááá·áºáááºá áá±á¬ááºááẠIndex Only Scan áá áºáá¯ááá¯á·.
- ááá·áºááœáẠáááºááá¯ážáá»á¬ážááŸáááŸáᬠá€áááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºááŸá¬ áááá¬áááºááŸá¬ážáá«áááºá
ts
á¡ááœáá·áºá¡áááºážáá²á·áᬠááŒááºáá»á±á¬áºááá¯ááºáááºá á¡áá»á¬ážá¡ááŒá¬ážáááŸááá«á. áááºááá¯á¶ááŸááºááá á¹á ááẠ"00:00:00.000" ááœáẠ"áááºážáá±á«ááºážáá»á¬ážá áœá¬áá±á¬á á¶áá»áááº" ááŒá áºáá«áá áááºááẠáá«ááá¯ááá¯ááºááá·áºáá«á ááá¯ááá¯áá¬á áá®ááá¯ááá á¹á áá»áá¯ážááœá± ááŒá áºááá¬ááá·áºáá°ážá ááá¯á·áá±á¬áº ááá¯ááá¯á·ááŒá áºáá¬áá«áá ááá¯ážáá»á²á·á¡ááœáŸááºážáá áºáá¯ááŒáá·áº ááœá±ážáá»ááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com