ืืืึทื ื ืขืก ืืืขื ืืืื ืงืืื ืงืึธืืคึผืืขืงืก ืงืึทืกืขืก ืืื ืกืึทืคืืกืืึทืงืืืืื ืึทืืืขืจืืืึทืื ืืื ืกืงื. ืึทืืฅ ืืืขื ืืืื ืืืืขืจ ืคึผืฉืื, ืืืืฃ ืืขืจ ืืืจืื ืคืื ืงืึทืคึผืืืึทื ืงืืึธืจ ืืื ืืขืจ ืืึธื - ืืึธืื ืืื ืื ืืึธื ืืึธืก ืืืืืื ื ืื ืืขืฉืขืขื ืืฉ ืจืขืืืกืืจื ืืืืกืืขืฉืืขืื ืืืื ืฆืืื.
ืึทื ืืื, ืขืก ืืื ืึท ืฆืืืื ืืื ืื ืืึทืืึทืืืืก 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
ืืื ื ืืฉื ืึท ืืื ืฆืืง ืฉืืืกื ืืื ืืขื ืืืฉ. ืืื ืคืึทืงื, ืืื ืืืึทื ืืืึทืืืขืก ืืขื ืขื ื ืืฉื ืืื ืฆืืง, ืืื ืงืืื "ืฆืืื" ืืื ืคืึทืงืืืฉ ืื ืึธืื - ืืขืจืืืขืจ, ืืขืจ ืืขืืืืงืขืจ ืจืขืงืึธืจื ืืื ืฆืืืื ืฉืืืื ืืฉ ืคึฟืจืืื ืืืืื "ืืืฉืึทืืคึผืก" ืคืื ืืืึทื ืฆื ืืืึทื ืจืขืื ืฆื ืึท ืึทื ืืขืจืฉ ืืขืฆื ืกืืจ ืืื ืื ืคืจืืืืืืขืจืง ืคืื ืกืึธืจืืื ื ืื ืืขืืืข ืฉืืืกื ืืืขืจื.
ืืื ืคืึทืงื, ืขืก ืืื ืืืื ืคืึทืจืืึธืจืื ืืึธ ืึท ืฆืืืืื ืคึผืจืึธืืืขื, ืืืึธืก ืืื ืคืื ืืขืจ ืฉืืืขืจ ืฆื ืืึทืืขืจืงื - ืขืืืขืืข ืืืื ืกื ืืืขื ื ืืฉื ืืืื ืืขืืืืื ืืืื! ื ืึธื ืึทืืข, ืื "ืืืคึผืืืงืึทื" ืจืขืงืึธืจืืก ืืขื ืืืขื ืขืืขืฆืขืจ ืึทื ืืขืจืฉ ืก ืคึผืืึทืฅ. ื ืืืืืืื ืืขืจืงืืขืจืื ื ืืื ืฉืืื ืืืืืขืจ ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื
ืืงืกืคึผืึทื ืืื ื ืื ืืื ืืขืงืก
ื ืืืืจืข ืืขืืืขืืึธืคึผืขืจ ืคืืจืฉืืืื ืึทื ืืขืจ ืืื ืืขืงืก ืฉืืืกื ืืึทืจืฃ ืืืื ืืื ืฆืืง, ืืื ืื ืืืืึทืกื ืืืขื ืืื ืฆื ืืงืกืคึผืึทื ื ืขืก ืืื ืึท ืืึธื ืืื ืฆืืง ืคืขืื, ืืืึธืก ืคึผืง ืืื ืืื ืฅ ืคึฟืึทืจ:
CREATE UNIQUE INDEX ON events(ts DESC, id DESC);
ืืื ืื ืืงืฉื ืืืืืืืืื:
SELECT
...
ORDER BY
ts DESC, id DESC
LIMIT 26 OFFSET $1;
#2. ืืึทืฉืืืืขื ืฆื "ืงืืจืกืึธืจืก"
ืขืืืขืืข ืืึธื ืฉืคึผืขืืขืจ, ืึท ืืืึท ืงืืื ืฆื ืืืจ ืืื ืืื "ืฆืืคืจืืื" ืึทื ืืืื ืจืืงืืืขืก
SELECT
...
WHERE
(ts, id) < ($1, $2) -- ะฟะพัะปะตะดะฝะธะต ะฟะพะปััะตะฝะฝัะต ะฝะฐ ะฟัะตะดัะดััะตะผ ัะฐะณะต ะทะฝะฐัะตะฝะธั
ORDER BY
ts DESC, id DESC
LIMIT 26;
ืื ืืืกื ื ื ืืช ืืขืืืขืื ืืื ืขืก ืืื ืืขืงืืืขื...
#3. ืจืืื ืืงืื ื ืื ืืขืงืกืื
ืืืืึทื ืืืื ืืึธื ืืืื ืืืึท ืืืืขื ืขื (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