เบกเบทเปเบเบตเปเบเบฐเบเปเปเบกเบตเบเปเบฅเบฐเบเบตเบเบตเปเบเบฑเบเบเปเบญเบเปเบฅเบฐ algorithms เบเบตเปเบเบฑเบเบเปเบญเบเปเบ SQL. เบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบฐเบเปเบฒเบเบเบฒเบเบซเบผเบฒเบ, เปเบเบฅเบฐเบเบฑเบเบเบญเบ Captain Obvious - เปเบซเปเปเบฎเบฑเบเบกเบฑเบ เปเบเบดเปเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเปเบซเบเบเบฒเบ เบเบฑเบเบฎเบฝเบเบเบฒเบกเปเบงเบฅเบฒ.
เบเบฑเปเบเปเบกเปเบ, เบกเบตเปเบเบทเปเบญเบเบซเบกเบฒเบเปเบเบเบฒเบเบเปเปเบกเบนเบ 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 เบเบฑเบเบชเบดเบเปเบ remake เบเบฒเบเปเบเปเบเบญเบเบเบฑเบ "เปเบฅเบทเปเบญเบเบเปเปเบกเบตเบเบตเปเบชเบดเปเบเบชเบธเบ" - เบเบฑเปเบเปเบกเปเบ, เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบเบฑเบเบซเบกเบปเบเบเบทเบเปเบเปเบกเบขเบนเปเปเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบฝเบงเบเบตเปเบเบนเปเปเบเปเบชเบฒเบกเบฒเบเปเบฅเบทเปเบญเบเบเบถเปเบเปเบฅเบฐเบฅเบปเบเปเบเป.
เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบ, เปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบปเบเบชเบญเบเบเปเปเปเบ, เปเบเบปเปเบฒเบเบทเบเบเบฑเบ เบเปเปเบฒเบเปเบญเบเบเบญเบเบเบฑเบเบเบถเบ เปเบโเบเบฒเบโเบเบปเบโเบเบฐโเบเบฝเบโ. เปเบเบฑเบเบซเบเบฑเบ, เปเบเบฒเบฐเบงเปเบฒเบเบฒเบเบฐเบฅเบฒเบเบกเบตเบเบฑเบเบเบฐเบเบตเบเบปเบเบเบฐเบเบด (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, เบกเบฑเบเปเบกเปเบเบญเบฑเบเบชเบธเบเบเปเบฒเบ.
เบซเบผเบทเบฎเบนเบเบเบฝเบงเบเบฑเบ:
เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเปเบเบเบฑเบเบเบธเบเบฑเบเบเบงเบเปเบฎเบปเบฒเบกเบต เบเบปเบงเบขเปเบฒเบเบเปเปเบกเบต "เบเบธเบเปเบฅเบตเปเบกเบเบปเปเบ" เบชเบฐเปเบเบฒเบฐ., เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเปเบกเบตเบซเบเบฑเบเบเบฑเบเบเบงเบฒเบเบเบงเบเปเบฎเบปเบฒเบเบฒเบ "เบเบฐเบซเบเบฒเบ" เบเปเบฒเบฎเปเบญเบเบเปเบเบตเปเปเบเบเบดเบเบเบฒเบเบเบปเบเบเบฑเบเบเปเบฒเบกเปเบฅเบฐเบเบฐเบเบดเบเบฑเบเบเบฒเบเปเบซเบผเบเบเปเปเบกเบนเบเปเบเบเปเบเบทเปเบญเบเปเบซเบงเบเบญเบเบเบฑเบเบเปเปเบกเบนเบเบเบฒเบ "เบเบธเบเบญเปเบฒเบเบญเบดเบ" เปเบเบเบฑเบเบชเบญเบเบเบดเบเบเบฒเบ - เบเบฑเบเบฅเบปเบเปเบฅเบฐเบเบถเปเบ.
เบซเบกเบฒเบเปเบซเบ
- เปเบกเปเบเปเบฅเปเบง, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเบปเปเบฒเปเบเบดเบเบเบฑเบเบเบฐเบเบตเบชเบญเบเบเบฑเปเบ, เปเบเปเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบกเปเบ "เปเบเบเบเบฑเบเบเบฐเบเบต". เบเบฑเปเบเบเบฑเปเบ, เบเบฒเบเบชเบญเบเบเบฒเบกเบเปเบญเบเบเบฝเบเปเบเปเบเบฐเบชเบปเปเบเบเบปเบเปเบซเป เปเบเบฑเบ Index เปเบเบตเปเบกเปเบเบตเบกเบซเบเบถเปเบเบเบฝเบเปเบเปเบชเบฐเปเบเบ.
- เบกเบฑเบเบเปเบญเบเบเปเบฒเบเบเบฐเปเบเปเบเบงเปเบฒเปเบเบฑเบเบเบดเบเบเบตเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเบเบฝเบเปเบเปเปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบกเบตเบเบธเบเบเปเบฒ
ts
เบชเบฒเบกเบฒเบเบเปเบฒเบกเบเบฝเบเปเบเปเปเบเบเบเบฑเบเปเบญเบตเบ, เปเบฅเบฐ เบเปเปเบกเบตเบเปเบฒเบเบงเบเบซเบผเบฒเบเบเบญเบเบเบงเบเปเบเบปเบฒ. เบเปเบฒเบเปเบฅเบฐเบเบตเบเบปเบเบเบฐเบเบดเบเบญเบเบเปเบฒเบเปเบกเปเบ "เบฅเปเบฒเบเบเบฑเบเบเบถเบเบขเบนเปเบเบตเป 00: 00: 00.000", เบเปเบฒเบเบเปเปเบเบงเบเปเบฎเบฑเบเปเบเบงเบเบตเป. เบเปเบฒเบเบฐเปเบเบปเปเบฒเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒ, เบเปเบฒเบเบเปเปเบเบงเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฅเบฐเบเบตเบเบฑเปเบเบเปเบฒเบงเปเบเบตเบเบเบถเปเบ. เปเบเปเบเปเบฒเบชเบดเปเบเบเบตเปเปเบเบตเบเบเบทเปเบ, เปเบซเปเปเบเปเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเบกเบตเบเบฑเบเบชเบฐเบเบตเบเบฐเบซเบเบฒเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com