แแฆแแก SQL-แจแ แแ แแฅแแแแ แ แแฃแแ แจแแแแฎแแแแแแ แแ แแแฎแแแฌแแแ แแแแแ แแแแแแ. แงแแแแแคแแ แ แซแแแแแ แแแ แขแแแ แแฅแแแแ, แแแแแขแแ แชแฎแแแ แแแแแแ - แแแแแ แแแแแแแแแ แฆแแแแกแซแแแแแก แ แแแกแขแ แแก แแแฎแแ แแแแแแแแฃแแแ แแ แแแก แแแฎแแแแแ.
แแแฃ แแแแแชแแแแ แแแแแจแ แแ แแก แแแจแแแ 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-แแแ โแแแ แแแแแ โ แแฃแจแแแแแแ แแแแแกแแแ.
แแแแ แแ แแแแแ แแแแแแแแแ แฃแคแ แ แแแแ แชแแแแแฃแ แแ แแแแแแแแ แแจแแแ แ แแ แแแแแแแแแ.
#1. OFFSET
SELECT
...
FROM
events
ORDER BY
ts DESC
LIMIT 26 OFFSET $1; -- 26 - ะทะฐะฟะธัะตะน ะฝะฐ ัััะฐะฝะธัะต, $1 - ะฝะฐัะฐะปะพ ัััะฐะฝะธัั
แกแแแแแ แแแฉแแแ แแแแแ แ 26? แแก แแ แแก แฉแแแแฌแแ แแแแก แกแแแแ แแฃแแ แ แแแแแแแแ แแ แแ แแแ แแแแก แจแแกแแแกแแแแ. แฃแคแ แ แแฃแกแขแแ, 25 แแแฉแแแแแแ แฉแแแแฌแแ แ, แแแฃแก 1, แ แแช แแแฃแแแแแแก แแแแแ, แ แแ แกแฃแ แชแแขแ แกแฎแแ แ แแแแ แแแแฃแจแจแ แแ แแแ แ แแฅแแก แแแแแแแแแแแแแก.
แ แ แแฅแแ แฃแแแ, แแก แแแแจแแแแแแแ แแ แจแแแซแแแแ "แจแแแแ แแแ" แแแแฎแแแแแก แกแฎแแฃแแจแ, แแแแ แแ แแแแแแชแแแ แแแ แแแแขแ แก. แแแแ แแ แแ แจแแแแฎแแแแแจแ, PostgreSQL แแแแ แแแก แแ แจแแแซแแแแ แแแแงแ แแแแก แชแแแแแก, แ แแ แฃแแแ แแงแแก แจแแแแ แแแแ แชแแขแ แฉแแแแฌแแ แ - แแ แแแแแแแ แแแ แฉแแแก แแ แแแคแแฅแขแฃแ แแแแแแก.
แแ แกแแแแ แแแแแแแชแแแก แแแขแแ แคแแแกแจแ, แ แแแกแขแ แแก แแแฎแแ แฎแแ แชแแแแแแแ แแแแฃแแแฃแ โแแแแ แแแแกโ แจแแ แแก แแแแแ แแแแ, แแแแ แฎแแแก แแแแแแแแแแแจแ แแแ แแแแ แจแแแแจแแแแก แ แแแแ แกแแแญแแแก. แแฃแกแขแแ แแ แแแแแแขแแแแ, แ แแแแกแแช แแแฎแแ แฎแแแฃแแแแแกแแแแก แแ แซแแแแจแ UI/UX แแแแแฌแงแแแขแก แแแขแแ แคแแแกแแก แแแแแแแแแแแก โแแแฃแแแแแแแ แแแแแฎแแแแแแโ - แแแฃ, แ แแแกแขแ แแก แงแแแแ แฉแแแแฌแแ แ แจแแแแแแแแแ แแ แ แกแแแจแ, แ แแแแแแแช แแแแฎแแแ แแแแแก แจแแฃแซแแแ แแแแแแฎแแแแก แแแแแ แแ แฅแแแแแ.
แแกแ แ แแ, แแแแแแแแ แขแแกแขแแ แแแแก แแ แแก แแฅแแแ แแแญแแ แแแ แฎแแ แ แฉแแแแฌแแ แแแแก แแฃแแแแ แแแ แ แแแกแขแ แจแ. แ แแขแแ, แ แแแแแ แชแฎแ แแแก แแฅแแก แแแ แแแแฃแ แ แแแแแฅแกแ (ts)
, แ แแแแแกแแช แแงแ แแแแแ แแฅแแแแ แจแแแแแฎแแ?
แแฃแกแขแแ แแแแขแแ แ แแ แแ แแแแแแแแแกแฌแแแ แแก ts
แแ แแ แแก แฃแแแแแแฃแ แ แแแกแแฆแแแ แแ แชแฎแ แแแจแ. แ แแแแฃแ แแ แแ แแแกแ แฆแแ แแแฃแแแแแแ แแ แแ แแก แฃแแแแแแฃแ แ, แ แแแแ แช แแแแแกแแแแ แ โแแ แโ แ แแแแฃแ แแแ แแแแแจแ - แแแแขแแ, แแ แแ แแ แแแแแ แฉแแแแฌแแ แ แแ แแแแแแแแ แ แแแแฎแแแแแจแ แแแแแแแ โแแแแแฎแขแโ แแแแ แแแแแ แแแแ แแแ แแแแกแฎแแแแแแฃแแ แกแแแแแแ แจแแแแแแแก แแแแ, แแแแแ แกแแแแแแซแ แแแแจแแแแแแแแก แแแฎแแ แแกแฎแแแแก แคแแ แแแแแจแ.
แคแแฅแขแแแ แแแแ, แแฅ แแแแ แ แแ แแแแแแแช แแแแแแแ, แ แแแแแก แจแแแฉแแแแแช แแแชแแแแแแ แ แแฃแแแ - แแแแแแ แแ แฉแแแแฌแแ แ แแ แแฅแแแแ แแแฉแแแแแแ แกแแแ แแแ! แแแแแก แแ แแแแแก, "แแฃแแแแแแขแแ" แฉแแแแฌแแ แแแแ แกแฎแแแกแ แแแแแแ แแแแแแแ. แแแขแแแฃแ แ แแฎแกแแ แแแแแแ แกแฃแ แแแแแแ แจแแแแซแแแแ แแฎแแแแ
แแแแแฅแกแแก แแแคแแ แแแแแ
แแแแแแ แแแแแแแแแ แก แแกแแแก, แ แแ แแแแแฅแกแแก แแแกแแฆแแแ แฃแแแ แแงแแก แฃแแแแแแฃแ แ แแ แฃแแแ แขแแแแกแ แแแแ แแแกแ แแแคแแ แแแแแ แแจแแแ แแ แฃแแแแแแฃแ แ แแแแแ, แ แแกแแแแกแแช PK แจแแกแแแแจแแแแแ:
CREATE UNIQUE INDEX ON events(ts DESC, id DESC);
แแ แแแแฎแแแแ แแชแแแแแ:
SELECT
...
ORDER BY
ts DESC, id DESC
LIMIT 26 OFFSET $1;
#2. โแแฃแ แกแแ แแแแโ แแแแแ แแแ
แแแ แแแแฃแแ แแแ แแแแแก แจแแแแแ, DBA แแแแแก แแฅแแแแแแ แแ "แแแฎแแ แฃแแแ" แแฅแแแแ แแแแฎแแแแแแแ
SELECT
...
WHERE
(ts, id) < ($1, $2) -- ะฟะพัะปะตะดะฝะธะต ะฟะพะปััะตะฝะฝัะต ะฝะฐ ะฟัะตะดัะดััะตะผ ัะฐะณะต ะทะฝะฐัะตะฝะธั
ORDER BY
ts DESC, id DESC
LIMIT 26;
แจแแแแแ แแแแแกแฃแแแฅแ, แกแแแแ แแ แแแแแแ...
#3. แแแกแฃแคแแแแแแแก แแแแแฅแกแแแ
แ แแแแแ แแ แ แแฆแแก แแฅแแแแ DBA แฌแแแแแแฎแ (ts DESC)
.
แแแแ แแ แ แ แแฃแงแแ แแแแ แแแแก แจแแ แแก แฉแแแแฌแแ แแแแก โแแแแแฎแขแแแแกโ แแแแแแแแ แแแ แแ แแแแแแแก?.. แแ แงแแแแแคแแ แ แแแ แขแแแแ - แแฅแแแ แฃแแแ แแแ แฉแแแ แแแแแแแ แฉแแแแฌแแ แแแแก แแแฃแคแแฅแกแแ แแแแแ แ แแแแแแแแแ!
แกแแแ แแแ, แแแ แแแแแ แซแแแแแก แฌแแแแแแแฎแแ แแ แ โแแฃแกแขแแ 26โ, แแ แแแแ โแแ แแแแแแแ 26โ? แแแแแแแแแ, แแกแ, แ แแ แจแแแแแ แแแแแจแ แแ แแก แแจแแแ แแ แแแแกแฎแแแแแแฃแแ แแแแจแแแแแแแแก แแฅแแแ แฉแแแแฌแแ แแแ ts
- แแแจแแ แแ แแฅแแแแ แแ แแแแแแ แแแแแแแก แจแแ แแก แฉแแแแฌแแ แแแแก "แฎแขแแแ"!
แแ, แ แแแแ แแแแแฆแฌแแแ แแแแก:
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-แแ แแแแแแแ แฉแแแแฌแแ แแ, แแก แแ แแก แแแแ.
แแ แแแแแ แกแฃแ แแแ:
แ แแแแแ แแฎแแ แแแแฅแแก แแแแฃแจแก แแ แแฅแแก แ แแแแ แแแแแ แแขแฃแแ "แแแกแแฌแงแแกแ", แแแจแแ แแ แแคแแ แ แแแแจแแแก แฎแแแก แแ แแแแฎแแแแแก โแแแคแแ แแแแแแจแโ แกแแแแ แแกแแแ แ แแแแแ แแฃแแแแแ แแ แแแแแแฎแแ แชแแแแแ แแแแแชแแแแ แแแแแแแแก แแแแแแแฃแ แ แแแขแแแ แแแ โแกแแชแแแแแ แ แฌแแ แขแแแแแแโ แแ แแแ แแแแแ แแฃแแแแแ - แ แแแแ แช แฅแแแแแ, แแกแแแ แแแแแ.
แจแแแแจแแแ:
- แแแแฎ, แแ แจแแแแฎแแแแแจแ แฉแแแ แแ แฏแแ แแฌแแแแแแ แแแแแฅแกแก, แแแแ แแ แงแแแแแคแแ แ "แแฎแแแแ แแแแแฅแกแแ". แแแแขแแ, แฅแแแแแแฎแแแแ แแฎแแแแ แแแแแแฌแแแแก แแ แแ แแแแแขแแแแแ แแฎแแแแ แแแแแฅแกแแก แกแแแแแ แแแ.
- แแจแแแ แแ, แ แแ แแ แขแแฅแแแแแก แแแแแงแแแแแ แจแแกแแซแแแแแแแ แแฎแแแแ แแแจแแ, แ แแแแกแแช แแฅแแแ แแแฅแแ แฆแแ แแแฃแแแแแแ
ts
แจแแแซแแแแ แแแแแแแแแ แแฎแแแแ แจแแแแฎแแแแแ แแ แแแแ แ แแแแแแแ แแ แแ แแก. แแฃ แแฅแแแแ แขแแแแฃแ แ แจแแแแฎแแแแแ โแแแแแแแ แฉแแแแฌแแ แ 00:00:00.000 แกแแแแแโ, แแก แแ แฃแแแ แแแแแแแแ. แแแฃแแแกแฎแแแ, แแ แฃแแแ แแแฃแจแแแ แแกแแแ แจแแแแฎแแแแ. แแแแ แแ แแฃ แแก แแแฎแแแแ, แแแแแแงแแแแ แแแ แแแแขแ แแแคแแ แแแแแฃแแ แแแแแฅแกแแ.
แฌแงแแ แ: www.habr.com