ืืืื ืื ืืืื ืืงืจืื ืืืจืืืื ืืืืืืจืืชืืื ืืชืืืืืื ื-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. ืึฐืงึทืึตื
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