Kajeno ha ho na ho ba le linyeoe tse rarahaneng le li-algorithms tse rarahaneng ho SQL. Ntho e 'ngoe le e' ngoe e tla ba bonolo haholo, boemong ba Captain Obvious - ha re e etse ho sheba ngoliso ea liketsahalo hlophisoa ka nako.
Ke hore, ho na le lets'oao ho database events
, mme o na le tshimo ts
- hantle nako eo re batlang ho hlahisa lirekoto tsena ka mokhoa o hlophisehileng:
CREATE TABLE events(
id
serial
PRIMARY KEY
, ts
timestamp
, data
json
);
CREATE INDEX ON events(ts DESC);
Ho hlakile hore re ke ke ra ba le lirekoto tse leshome le metso e 'meli moo, kahoo re tla hloka mofuta o itseng oa ho tsamaea leqepheng.
#0. "Ke 'na motlatsi oa' mè oa ka"
cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);
E batla e se metlae - ha e tloaelehe, empa e fumanoa naheng. Ka linako tse ling, ka mor'a ho sebetsa le ORM, ho ka ba thata ho fetohela mosebetsing oa "direct" le SQL.
Empa ha re feteleng pele ho mathata a tloaelehileng le a sa bonahaleng haholo.
#1. TSOHLE
SELECT
...
FROM
events
ORDER BY
ts DESC
LIMIT 26 OFFSET $1; -- 26 - записей на странице, $1 - начало страницы
Nomoro ea 26 e tsoa hokae? Ena ke palo e lekantsoeng ea likenyo ho tlatsa skrini se le seng. Hantle-ntle, lirekoto tse 25 tse bonts'itsoeng, hammoho le 1, tse bontšang hore bonyane ho na le ntho e 'ngoe hape ka har'a sampole mme hoa utloahala ho tsoela pele.
Ha e le hantle, boleng bona bo ke ke ba "rokoa" 'meleng oa kopo, empa bo fetisoa ka parameter. Empa tabeng ena, kemiso ea PostgreSQL e ke ke ea khona ho itšetleha ka tsebo ea hore ho lokela ho ba le litlaleho tse fokolang - mme o tla khetha habonolo moralo o sa sebetseng.
'Me ha u ntse u le sebopeho sa kopo, ho shebella registry ho kenngoa ts'ebetsong pakeng tsa "maqephe" a bonahalang, ha ho motho ea hlokomelang ntho leha e le efe e belaetsang ka nako e telele. Hantle-ntle ho fihlela motsotso oo, ntoeng ea ho ba bonolo, UI / UX e etsa qeto ea ho fetola sebopeho hore se "phelloe ka ho sa feleng" - ke hore, lipehelo tsohle tsa ngoliso li huloa lethathamong le le leng leo mosebelisi a ka le tsamaisang holimo le tlase.
'Me kahoo, nakong ea teko e latelang, ua tšoaroa phetiso ea litlaleho ho ngolisoang. Hobaneng, hobane tafole e na le index e tloaelehileng (ts)
, eo potso ea hau e itšetlehileng ka eona?
Hantle hobane o ne o sa nahane ka seo ts
ha se senotlolo se ikhethileng tafoleng ena. Ha e le hantle, le boleng ba eona ha bo ikhethang, joalo ka "nako" efe kapa efe maemong a nnete - ka hona, rekoto e tšoanang lipotsong tse peli tse haufi "e tlolela" habonolo ho tloha leqepheng ho ea leqepheng ka lebaka la tatellano e fapaneng ea ho qetela ka har'a moralo oa ho hlophisa boleng bo tšoanang ba senotlolo.
Ebile, ho boetse ho na le bothata ba bobeli bo patiloeng mona, boo ho leng thata haholo ho bo bona - tse ling li ke ke tsa bontšoa ho hang! Ntle le moo, lirekoto tsa "kopi" li nkile sebaka sa motho e mong. Tlhaloso e qaqileng e nang le litšoantšo tse ntle e ka fumanoa
Ho atolosa index
Moqapi ea masene o utloisisa hore senotlolo sa index se hloka ho etsoa se ikhethang, 'me tsela e bonolo ka ho fetisisa ke ho e atolosa ka tšimo e ikhethang, eo PK e loketseng bakeng sa eona:
CREATE UNIQUE INDEX ON events(ts DESC, id DESC);
Mme kopo e fetoha:
SELECT
...
ORDER BY
ts DESC, id DESC
LIMIT 26 OFFSET $1;
#2. Fetolela ho "cursors"
Nako hamorao, DBA e tla ho uena 'me e "thabela" likopo tsa hau
SELECT
...
WHERE
(ts, id) < ($1, $2) -- последние полученные на предыдущем шаге значения
ORDER BY
ts DESC, id DESC
LIMIT 26;
O ile wa hema ho fihlela e fihla...
#3. Ho hloekisa li-index
Hobane ka letsatsi le leng DBA ea hau e ile ea bala (ts DESC)
.
Empa u lokela ho etsa'ng ka bothata ba pele ba "ho qhomela" litlaleho pakeng tsa maqephe?
Ka kakaretso, ke mang ea re hanelang ho bala eseng "hantle 26", empa "eseng ka tlase ho 26"? Ka mohlala, e le hore ka block e latelang ho na le direkoto tse nang le meelelo e fapaneng ka ho hlaka ts
- joale ho ke ke ha e-ba le bothata ka "ho qhoma" litlaleho pakeng tsa li-blocks!
Mona ke mokhoa oa ho fihlela sena:
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;
Ho etsahalang moo?
- Re hata lirekoto tsa 25 "fatše" 'me re fumana boleng ba "moeli".
ts
. - Haeba ha ho na letho le se le ntse le le teng, fetola boleng ba NULL ka
-infinity
. - Re tlosa karolo eohle ea boleng lipakeng tsa boleng bo amoheloang
ts
le paramethara ea $ 1 e fetisitsoeng ho tsoa ho sehokelo (boleng bo fanoeng ke "ho qetela" bo fetileng). - Haeba boloko bo khutlisoa ka lirekoto tse ka tlase ho 26, ke ea ho qetela.
Kapa setšoantšo se tšoanang:
Hobane joale re na le sampole ha e na "qalo" e tobileng, joale ha ho letho le re thibelang ho "atolosa" kopo ena ka lehlakoreng le fapaneng le ho kenya ts'ebetsong ho kenya li-block tsa data ho tloha "reference point" mahlakoreng ka bobeli - ho ea tlase le holimo.
Hlokomela
- E, tabeng ena re fumana index habeli, empa ntho e 'ngoe le e' ngoe e "purely by index". Ka hona, subquery e tla fella feela ho e 'ngoe e eketsehileng ea Index Feela Scan.
- Ho hlakile hore mokhoa ona o ka sebelisoa feela ha o na le litekanyetso
ts
ka tšela feela ka monyetla, le ha ho ba bangata ba bona. Haeba nyeoe ea hau e tloaelehileng e le "litlaleho tse milione ka 00:00:00.000", ha ua lokela ho etsa sena. Ke bolela, ha ua lokela ho lumella nyeoe e joalo hore e etsahale. Empa haeba sena se etsahala, sebelisa khetho ka index e atolositsoeng.
Source: www.habr.com