Dhau mus lawm hnub uas koj tsis tas yuav txhawj txog kev ua kom zoo dua ntawm cov ntaub ntawv database. Lub sijhawm txav mus. Txhua tus neeg ua lag luam thev naus laus zis tshiab xav tsim Facebook tom ntej, thaum tseem sim sau tag nrho cov ntaub ntawv uas lawv tuaj yeem tau txais. Cov lag luam xav tau cov ntaub ntawv no los cob qhia cov qauv zoo dua uas pab lawv khwv tau nyiaj. Hauv cov xwm txheej no, cov neeg sau program yuav tsum tsim cov APIs uas tso cai rau lawv ua haujlwm sai thiab ntseeg tau nrog cov ntaub ntawv loj heev.
Yog tias koj tau tsim cov ntawv thov lossis cov ntaub ntawv hauv server tau ib ntus, tej zaum koj tau sau cov code los ua cov lus nug uas muaj nplooj ntawv. Piv txwv li, ib yam dab tsi zoo li no:
SELECT * FROM table_name LIMIT 10 OFFSET 40
Puas yog li ntawd?
Tab sis yog tias qhov ntawd yog li cas koj tau ua nplooj ntawv, kuv thov txim uas koj tsis tau ua nws hauv txoj hauv kev zoo tshaj plaws.
Koj puas xav tawm tsam kuv? . , и twb siv cov txheej txheem uas kuv xav tham txog hnub no lawm.
Sau ib tus neeg tsim khoom backend uas tsis tau siv dua li OFFSET и LIMIT rau kev ua cov lus nug uas muaj nplooj ntawv. Txoj hauv kev no siv tau zoo rau MVPs (Cov Khoom Siv Tsawg Kawg Nkaus) thiab cov haujlwm uas siv cov ntaub ntawv me me. Nws "ua haujlwm xwb," yog li hais.
Tab sis yog tias koj xav tau tsim cov txheej txheem txhim khu kev qha thiab ua haujlwm tau zoo los ntawm kos, nws tsim nyog saib xyuas ua ntej qhov ua tau zoo ntawm kev ua cov lus nug rau cov ntaub ntawv siv hauv cov txheej txheem zoo li no.
Niaj hnub no peb yuav tham txog cov teeb meem cuam tshuam nrog kev siv feem ntau (hmoov tsis zoo) paginated query engine implementations, thiab yuav ua li cas kom ua tiav kev ua tau zoo thaum ua cov lus nug zoo li no.
Muaj teeb meem dab tsi nrog OFFSET thiab LIMIT?
Raws li twb tau hais lawm, OFFSET и LIMIT Lawv ua tau zoo hauv cov haujlwm uas tsis tas yuav ua haujlwm nrog cov ntaub ntawv ntau.
Qhov teeb meem tshwm sim thaum lub database loj hlob mus rau qhov loj me uas nws tsis haum rau hauv lub cim xeeb ntawm lub server. Txawm li cas los xij, cov lus nug uas muaj nplooj ntawv yuav tsum tau siv thaum ua haujlwm nrog lub database no.
Rau qhov teeb meem no kom pom tseeb, yuav tsum muaj qhov xwm txheej uas DBMS siv rau qhov kev ua haujlwm Full Table Scan tsis zoo rau txhua qhov kev nug paginated (tib lub sijhawm, kev ntxig thiab rho tawm cov haujlwm yuav tshwm sim, thiab peb tsis xav tau cov ntaub ntawv qub!).
"Kev luam theej tag nrho lub rooj" (lossis "kev luam theej lub rooj sib law liag") yog dab tsi? Nws yog ib qho kev ua haujlwm uas DBMS nyeem txhua kab ntawm lub rooj - uas yog, cov ntaub ntawv nws muaj - thiab kuaj xyuas nws raws li qhov xwm txheej tshwj xeeb. Hom kev luam theej lub rooj no paub tias qeeb tshaj plaws. Qhov no yog vim nws cuam tshuam ntau yam kev ua haujlwm I / O, uas siv lub server's disk subsystem. Qhov xwm txheej no tau ua rau muaj kev ntxhov siab los ntawm kev ncua sijhawm cuam tshuam nrog kev nkag mus rau cov ntaub ntawv khaws cia rau hauv disk, thiab qhov tseeb tias kev hloov cov ntaub ntawv los ntawm disk mus rau lub cim xeeb yog kev ua haujlwm siv zog ntau.
Piv txwv li, koj muaj cov ntaub ntawv ntawm 100000000 tus neeg siv thiab koj ua ib qho lus nug nrog lub tsev OFFSET 50000000Qhov no txhais tau tias DBMS yuav tsum thauj tag nrho cov ntaub ntawv no (thiab peb tsis xav tau lawv!), muab tso rau hauv lub cim xeeb, thiab tsuas yog tom qab ntawd coj, piv txwv li, 20 qhov tshwm sim tau tshaj tawm hauv LIMIT.
Piv txwv li, nws yuav zoo li no: "xaiv cov kab ntawm 50000 txog 50020 ntawm 100000." Qhov ntawd txhais tau tias lub kaw lus yuav tsum thauj 50000 kab ua ntej kom ua tiav cov lus nug. Koj puas pom tias nws yuav tsum ua haujlwm tsis tsim nyog ntau npaum li cas?
Yog koj tsis ntseeg kuv, saib qhov piv txwv uas kuv tau tsim los ntawm kev siv cov peev xwm .

Piv txwv ntawm db-fiddle.com
Nyob ntawd, sab laug, hauv daim teb Schema SQL, muaj ib daim code uas ntxig 100000 kab rau hauv lub database, thiab sab xis, hauv daim teb Query SQL, ob lo lus nug tau pom. Thawj qhov, qeeb, zoo li no:
SELECT *
FROM `docs`
LIMIT 10 OFFSET 85000;
Thiab qhov thib ob, uas yog ib qho kev daws teeb meem zoo rau tib qho teeb meem, yog:
SELECT *
FROM `docs`
WHERE id > 85000
LIMIT 10;
Yuav kom ua tiav cov kev thov no, tsuas yog nias rau ntawm lub pob Run nyob rau sab saum toj ntawm nplooj ntawv. Tom qab ua qhov no, cia peb piv cov sijhawm ua haujlwm ntawm cov lus nug. Nws hloov tawm tias cov lus nug tsis zoo siv sijhawm tsawg kawg 30 zaug ntev dua li qhov thib ob (lub sijhawm no txawv ntawm kev khiav mus rau kev khiav; piv txwv li, lub kaw lus yuav tshaj tawm tias thawj qhov lus nug siv sijhawm 37 ms los ua haujlwm, thaum qhov thib ob siv sijhawm 1 ms).
Thiab yog tias muaj ntau cov ntaub ntawv ntxiv, ces txhua yam yuav zoo li phem dua (kom ntseeg qhov no, saib kuv nrog 10 lab kab).
Qhov peb nyuam qhuav tham txog yuav tsum muab qee qhov kev nkag siab rau koj txog qhov kev ua tiav ntawm cov lus nug hauv database.
Thov nco ntsoov tias tus nqi siab dua OFFSET — qhov kev thov yuav siv sijhawm ntev npaum li cas los ua tiav.
Kuv yuav tsum siv dab tsi es tsis txhob siv OFFSET thiab LIMIT ua ke?
Es tsis txhob ua ke OFFSET и LIMIT Nws yog ib qho tsim nyog siv tus qauv tsim raws li cov qauv hauv qab no:
SELECT * FROM table_name WHERE id > 10 LIMIT 20
Qhov no yog kev ua tiav ntawm cov lus nug raws li tus cursor.
Es tsis txhob khaws cov tam sim no hauv zos OFFSET и LIMIT thiab xa lawv nrog txhua qhov kev thov, koj yuav tsum khaws tus yuam sij tseem ceeb kawg tau txais (feem ntau qhov no yog ID) thiab LIMIT, yog li ntawd, koj yuav tau txais cov lus nug zoo ib yam li qhov saum toj no.
Vim li cas? Los ntawm kev qhia meej txog tus cim ntawm kab kawg nyeem, koj qhia koj lub DBMS qhov twg yuav pib tshawb nrhiav cov ntaub ntawv xav tau. Ntxiv mus, kev siv tus yuam sij yuav tso cai rau kev tshawb nrhiav zoo, tiv thaiv lub kaw lus kom tsis txhob raug cuam tshuam los ntawm cov kab sab nraud ntawm qhov ntau thiab tsawg.
Cia peb saib qhov kev sib piv kev ua tau zoo ntawm ntau cov lus nug hauv qab no. Nov yog cov lus nug tsis ua haujlwm zoo.

Kev thov qeeb
Nov yog ib qho version optimized ntawm cov lus nug no.

Kev thov sai
Ob qho lus nug rov qab los tib yam nkaus. Tab sis thawj zaug siv sijhawm 12,80 vib nas this kom tiav, thaum qhov thib ob siv sijhawm 0,01 vib nas this. Koj puas pom qhov txawv?
Tej teeb meem tshwm sim
Yuav kom paub tseeb tias txoj kev ua cov lus nug no ua haujlwm tau zoo, lub rooj yuav tsum muaj ib kem (lossis ntau kem) uas muaj cov cim qhia tshwj xeeb, xws li tus lej cim. Hauv qee kis tshwj xeeb, qhov no tuaj yeem txiav txim siab qhov ua tiav ntawm cov lus nug no los txhim kho kev ua haujlwm ntawm lub hauv paus ntaub ntawv.
Ntawm chav kawm, thaum tsim cov lus nug, koj yuav tsum xav txog cov ntsiab lus ntawm cov qauv rooj thiab xaiv cov txheej txheem uas yuav ua haujlwm zoo tshaj plaws nrog cov rooj uas twb muaj lawm. Piv txwv li, yog tias koj xav tau ua haujlwm nrog cov lus nug uas muaj cov ntaub ntawv ntau heev, koj yuav pom tias nws nthuav. tsab xov xwm.
Yog tias peb ntsib teeb meem ntawm kev ploj tus yuam sij tseem ceeb, piv txwv li yog tias peb muaj lub rooj nrog kev sib raug zoo ntawm ntau-rau-ntau, ces txoj hauv kev ib txwm siv OFFSET и LIMIT, tau lees tias yuav ua haujlwm rau peb. Txawm li cas los xij, nws siv tuaj yeem ua rau cov lus nug qeeb. Hauv cov xwm txheej zoo li no, kuv xav kom siv tus yuam sij tseem ceeb uas tsis siv neeg nce ntxiv, txawm tias nws tsuas yog xav tau los txhawb cov lus nug uas muaj nplooj ntawv xwb.
Yog koj xav paub ntxiv txog qhov teeb meem no - , и - qee cov ntaub ntawv muaj txiaj ntsig.
Cov txiaj ntsim tau los
Lub ntsiab lus tseem ceeb uas peb tuaj yeem kos tau yog tias, txawm tias lub database loj npaum li cas los xij, nws ib txwm tseem ceeb rau kev tshuaj xyuas kev ua tau zoo ntawm cov lus nug. Kev nthuav dav ntawm cov kev daws teeb meem yog qhov tseem ceeb heev niaj hnub no, thiab kev tsim lub kaw lus kom raug txij thaum pib tuaj yeem txuag tus tsim tawm ntau yam teeb meem tom qab.
Koj ua li cas los txheeb xyuas thiab ua kom zoo dua cov lus nug hauv database?
Tau qhov twg los: www.hab.com
