MeklÄÅ”anas rezultÄtu izvades un veiktspÄjas problÄmas
Viens no tipiskiem scenÄrijiem visÄs mums pazÄ«stamajÄs lietojumprogrammÄs ir datu meklÄÅ”ana pÄc noteiktiem kritÄrijiem un to attÄloÅ”ana viegli lasÄmÄ formÄ. Var bÅ«t arÄ« papildu kÄrtoÅ”anas, grupÄÅ”anas un lapoÅ”anas opcijas. Uzdevums teorÄtiski ir triviÄls, taÄu, to risinot, daudzi izstrÄdÄtÄji pieļauj vairÄkas kļūdas, kas vÄlÄk liek ciest produktivitÄtei. MÄÄ£inÄsim apsvÄrt dažÄdas iespÄjas Ŕīs problÄmas risinÄÅ”anai un formulÄsim ieteikumus efektÄ«vÄkÄs ievieÅ”anas izvÄlei.
Peidžeru opcija Nr. 1
VienkÄrÅ”ÄkÄ iespÄja, kas nÄk prÄtÄ, ir meklÄÅ”anas rezultÄtu rÄdÄ«Å”ana pa lappusÄm klasiskÄkajÄ formÄ.
PieÅemsim, ka jÅ«su lietojumprogramma izmanto relÄciju datu bÄzi. Å ajÄ gadÄ«jumÄ, lai parÄdÄ«tu informÄciju Å”ajÄ veidlapÄ, jums bÅ«s jÄpalaiž divi SQL vaicÄjumi:
IegÅ«t rindas paÅ”reizÄjai lapai.
AprÄÄ·iniet kopÄjo rindu skaitu, kas atbilst meklÄÅ”anas kritÄrijiem - tas ir nepiecieÅ”ams, lai parÄdÄ«tu lapas.
ApskatÄ«sim pirmo vaicÄjumu, kÄ piemÄru izmantojot testa MS SQL datu bÄzi AdventureWorks 2016. gada serverim. Å im nolÅ«kam izmantosim tabulu Sales.SalesOrderHeader:
SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
IepriekÅ” minÄtais vaicÄjums atgriezÄ«s pirmos 50 pasÅ«tÄ«jumus no saraksta, kas sakÄrtoti pÄc pievienoÅ”anas datuma dilstoÅ”Ä secÄ«bÄ, citiem vÄrdiem sakot, 50 jaunÄkie pasÅ«tÄ«jumi.
TestÄÅ”anas bÄzÄ tas darbojas Ätri, taÄu apskatÄ«sim izpildes plÄnu un I/O statistiku:
Katra vaicÄjuma I/O statistiku var iegÅ«t, vaicÄjuma izpildlaikÄ palaižot komandu SET STATISTICS IO ON.
KÄ redzams izpildes plÄnÄ, resursietilpÄ«gÄkÄ iespÄja ir kÄrtot visas avota tabulas rindas pÄc pievienoÅ”anas datuma. Un problÄma ir tÄ, ka, jo vairÄk rindu parÄdÄ«sies tabulÄ, jo āgrÅ«tÄkaā bÅ«s ŔķiroÅ”ana. PraksÄ no Å”ÄdÄm situÄcijÄm vajadzÄtu izvairÄ«ties, tÄpÄc pievienosim indeksu pievienoÅ”anas datumam un paskatÄ«simies, vai resursu patÄriÅÅ” ir mainÄ«jies:
AcÄ«mredzot tas ir kļuvis daudz labÄks. Bet vai visas problÄmas ir atrisinÄtas? MainÄ«sim vaicÄjumu, lai meklÄtu pasÅ«tÄ«jumus, kuru kopÄjÄs preÄu izmaksas pÄrsniedz 100 ASV dolÄrus:
SELECT * FROM Sales.SalesOrderHeader
WHERE SubTotal > 100
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
Mums ir smieklÄ«ga situÄcija: vaicÄjumu plÄns nav daudz sliktÄks par iepriekÅ”Äjo, bet faktiskais loÄ£isko nolasÄ«jumu skaits ir gandrÄ«z divreiz lielÄks nekÄ ar pilnu tabulu skenÄÅ”anu. Ir izeja - ja izveidosim saliktu indeksu no jau esoÅ”a indeksa un kÄ otro lauku pievienosim kopÄjo preÄu cenu, atkal iegÅ«sim 165 loÄ£iskus nolasÄ«jumus:
CREATE INDEX IX_SalesOrderHeader_OrderDate_SubTotal on Sales.SalesOrderHeader(OrderDate, SubTotal);
Å o piemÄru sÄriju var turpinÄt vÄl ilgi, bet divas galvenÄs domas, kuras es vÄlos izteikt Å”eit, ir:
Jebkura jauna kritÄrija vai kÄrtoÅ”anas secÄ«bas pievienoÅ”ana meklÄÅ”anas vaicÄjumam var bÅ«tiski ietekmÄt meklÄÅ”anas vaicÄjuma Ätrumu.
Bet, ja mums ir jÄatÅem tikai daļa datu, nevis visi rezultÄti, kas atbilst meklÄÅ”anas vienumiem, ir daudz veidu, kÄ optimizÄt Å”Ädu vaicÄjumu.
Tagad pÄriesim pie otrÄ vaicÄjuma, kas minÄts paÅ”Ä sÄkumÄ ā tÄ, kas uzskaita meklÄÅ”anas kritÄrijam atbilstoÅ”o ierakstu skaitu. Å emsim to paÅ”u piemÄru ā meklÄjot pasÅ«tÄ«jumus, kuru vÄrtÄ«ba pÄrsniedz 100 ASV dolÄrus:
SELECT COUNT(1) FROM Sales.SalesOrderHeader
WHERE SubTotal > 100
Å emot vÄrÄ iepriekÅ” norÄdÄ«to salikto indeksu, mÄs iegÅ«stam:
Tas, ka vaicÄjums iet cauri visam indeksam, nav pÄrsteidzoÅ”s, jo lauks SubTotal nav pirmajÄ pozÄ«cijÄ, tÄpÄc vaicÄjums to nevar izmantot. ProblÄma tiek atrisinÄta, pievienojot vÄl vienu indeksu laukÄ SubTotal, un rezultÄtÄ tas dod tikai 48 loÄ£iskus nolasÄ«jumus.
Varat sniegt vÄl dažus daudzumu skaitÄ«Å”anas pieprasÄ«jumu piemÄrus, taÄu bÅ«tÄ«ba paliek nemainÄ«ga: Datu daļas saÅemÅ”ana un kopÄjÄs summas saskaitÄ«Å”ana ir divi principiÄli atŔķirÄ«gi pieprasÄ«jumi, un katram ir nepiecieÅ”ami savi optimizÄcijas pasÄkumi. KopumÄ jÅ«s nevarÄsit atrast indeksu kombinÄciju, kas vienlÄ«dz labi darbojas abiem vaicÄjumiem.
AttiecÄ«gi viena no bÅ«tiskÄm prasÄ«bÄm, kas bÅ«tu jÄprecizÄ, izstrÄdÄjot Å”Ädu meklÄÅ”anas risinÄjumu, ir, vai uzÅÄmumam tieÅ”Äm ir svarÄ«gi redzÄt kopÄjo atrasto objektu skaitu. Bieži gadÄs, ka nÄ. Un navigÄcija pÄc konkrÄtiem lappuÅ”u numuriem, manuprÄt, ir risinÄjums ar ļoti Å”auru darbÄ«bas jomu, jo vairums peidžeru scenÄriju izskatÄs kÄ āpÄriet uz nÄkamo lapuā.
Peidžeru opcija Nr. 2
PieÅemsim, ka lietotÄjiem nav svarÄ«gi zinÄt kopÄjo atrasto objektu skaitu. MÄÄ£inÄsim vienkÄrÅ”ot meklÄÅ”anas lapu:
Faktiski ir mainÄ«jies tikai tas, ka nav iespÄjams pÄrvietoties uz konkrÄtiem lapu numuriem, un tagad Å”ai tabulai nav jÄzina, cik to var bÅ«t, lai to parÄdÄ«tu. Bet rodas jautÄjums - kÄ tabula zina, vai ir dati par nÄkamo lapu (lai pareizi parÄdÄ«tu saiti "NÄkamais")?
Atbilde ir ļoti vienkÄrÅ”a: jÅ«s varat nolasÄ«t no datu bÄzes par vienu ierakstu vairÄk, nekÄ nepiecieÅ”ams attÄloÅ”anai, un Ŕī āpapilduā ieraksta klÄtbÅ«tne parÄdÄ«s, vai ir nÄkamÄ daļa. TÄdÄ veidÄ jums ir nepiecieÅ”ams izpildÄ«t tikai vienu pieprasÄ«jumu, lai iegÅ«tu vienu datu lapu, kas ievÄrojami uzlabo veiktspÄju un atvieglo Å”Ädas funkcionalitÄtes atbalstu. ManÄ praksÄ bija gadÄ«jums, kad atteikÅ”anÄs skaitÄ«t kopÄjo ierakstu skaitu paÄtrina rezultÄtu piegÄdi 4-5 reizes.
Å ai pieejai ir vairÄkas lietotÄja saskarnes opcijas: komandas "atpakaļ" un "uz priekÅ”u", tÄpat kÄ iepriekÅ” minÄtajÄ piemÄrÄ, poga "ielÄdÄt vairÄk", kas vienkÄrÅ”i pievieno parÄdÄ«tajiem rezultÄtiem jaunu daļu, "bezgalÄ«ga ritinÄÅ”ana", kas darbojas. pÄc principa "ielÄdÄt vairÄk", bet signÄls, lai iegÅ«tu nÄkamo daļu, ir lietotÄjam, lai ritinÄtu visus parÄdÄ«tos rezultÄtus lÄ«dz beigÄm. Lai kÄds bÅ«tu vizuÄlais risinÄjums, datu izlases princips paliek nemainÄ«gs.
Peidžeru ievieŔanas nianses
Visos iepriekÅ” sniegtajos vaicÄjumu piemÄros tiek izmantota pieeja ānobÄ«de + skaitÄ«Å”anaā, kad pats vaicÄjums norÄda, kÄdÄ secÄ«bÄ ir jÄatgriež rezultÄtu rindas un cik rindu ir jÄatgriež. Vispirms apskatÄ«sim, kÄ Å”ajÄ gadÄ«jumÄ vislabÄk organizÄt parametru nodoÅ”anu. PraksÄ esmu sastapies ar vairÄkÄm metodÄm:
PieprasÄ«tÄs lapas sÄrijas numurs (pageIndex), lapas izmÄrs (pageSize).
PirmÄ atgriežamÄ ieraksta sÄrijas numurs (startIndex), maksimÄlais ierakstu skaits rezultÄtÄ (skaits).
No pirmÄ acu uzmetiena var Ŕķist, ka tas ir tik elementÄri, ka nav nekÄdas atŔķirÄ«bas. Bet tas tÄ nav - ÄrtÄkÄ un universÄlÄkÄ iespÄja ir otrÄ (startIndex, count). Tam ir vairÄki iemesli:
IepriekÅ” aprakstÄ«tajai +1 ieraksta korektÅ«ras pieejai pirmÄ opcija ar pageIndex un pageSize ir ÄrkÄrtÄ«gi neÄrta. PiemÄram, mÄs vÄlamies parÄdÄ«t 50 ziÅas vienÄ lapÄ. SaskaÅÄ ar iepriekÅ” minÄto algoritmu jums ir jÄizlasa par vienu ierakstu vairÄk nekÄ nepiecieÅ”ams. Ja Å”is ā+1ā nav ieviests serverÄ«, izrÄdÄs, ka pirmajai lapai mums ir jÄpieprasa ieraksti no 1 lÄ«dz 51, otrajai - no 51 lÄ«dz 101 utt. Ja norÄdÄt lapas izmÄru 51 un palielinÄsit pageIndex, tad otrÄ lapa atgriezÄ«sies no 52 uz 102 utt. AttiecÄ«gi pirmajÄ variantÄ vienÄ«gais veids, kÄ pareizi ieviest pogu, lai pÄrietu uz nÄkamo lapu, ir likt serverim pÄrbaudÄ«t āpapilduā rindiÅu, kas bÅ«s ļoti netieÅ”a nianse.
TreÅ”ajai opcijai vispÄr nav jÄgas, jo, lai izpildÄ«tu vaicÄjumus lielÄkajÄ daÄ¼Ä datu bÄzu, jums joprojÄm ir jÄnokÄrto skaitÄ«Å”ana, nevis pÄdÄjÄ ieraksta indekss. StartIndex atÅemÅ”ana no endIndex var bÅ«t vienkÄrÅ”a aritmÄtiska darbÄ«ba, taÄu Å”eit tÄ ir lieka.
Tagad mums jÄapraksta peidžeru ievieÅ”anas trÅ«kumi, izmantojot ānobÄ«de + daudzumsā:
Katras nÄkamÄs lapas izgÅ«Å”ana bÅ«s dÄrgÄka un lÄnÄka nekÄ iepriekÅ”ÄjÄ, jo datu bÄzei vÄl bÅ«s jÄiziet cauri visi ieraksti āno sÄkumaā pÄc meklÄÅ”anas un kÄrtoÅ”anas kritÄrijiem un tad jÄapstÄjas pie vÄlamÄ fragmenta.
Ne visas DBVS var atbalstīt Ŕo pieeju.
Ir alternatÄ«vas, taÄu tÄs ir arÄ« nepilnÄ«gas. Pirmo no Ŕīm pieejÄm sauc par āatslÄgkopu peidžeruā vai āmeklÄÅ”anas metodiā, un tÄ ir Å”Äda: pÄc daļas saÅemÅ”anas varat atcerÄties lauku vÄrtÄ«bas lapas pÄdÄjÄ ierakstÄ un pÄc tam izmantot tÄs, lai iegÅ«tu nÄkamÄ porcija. PiemÄram, mÄs izpildÄ«jÄm Å”Ädu vaicÄjumu:
SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
Un pÄdÄjÄ ierakstÄ mÄs saÅÄmÄm pasÅ«tÄ«juma datuma vÄrtÄ«bu ā2014-06-29ā. PÄc tam, lai iegÅ«tu nÄkamo lapu, varat mÄÄ£inÄt rÄ«koties Å”Ädi:
SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate < '2014-06-29'
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
ProblÄma ir tÄda, ka OrderDate nav unikÄls lauks, un iepriekÅ” norÄdÄ«tajÄ nosacÄ«jumÄ, iespÄjams, netiks rÄdÄ«ts daudz obligÄto rindu. Lai Å”im vaicÄjumam pievienotu nepÄrprotamÄ«bu, nosacÄ«jumam jÄpievieno unikÄls lauks (pieÅemsim, ka 75074 ir primÄrÄs atslÄgas pÄdÄjÄ vÄrtÄ«ba no pirmÄs daļas):
SELECT * FROM Sales.SalesOrderHeader
WHERE (OrderDate = '2014-06-29' AND SalesOrderID < 75074)
OR (OrderDate < '2014-06-29')
ORDER BY OrderDate DESC, SalesOrderID DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
Å Ä« opcija darbosies pareizi, taÄu kopumÄ to bÅ«s grÅ«ti optimizÄt, jo nosacÄ«jums satur operatoru VAI. Ja primÄrÄs atslÄgas vÄrtÄ«ba palielinÄs, palielinoties OrderDate, nosacÄ«jumu var vienkÄrÅ”ot, atstÄjot tikai filtru pÄc SalesOrderID. Bet, ja nav stingras korelÄcijas starp primÄrÄs atslÄgas vÄrtÄ«bÄm un lauku, pÄc kura tiek kÄrtots rezultÄts, lielÄkajÄ daÄ¼Ä DBVS nevar izvairÄ«ties no Ŕī VAI. IzÅÄmums, par kuru es zinu, ir PostgreSQL, kas pilnÄ«bÄ atbalsta koreÅ”u salÄ«dzinÄÅ”anu, un iepriekÅ” minÄto nosacÄ«jumu var rakstÄ«t kÄ "WHERE (OrderDate, SalesOrderID) < ('2014-06-29', 75074)". Å emot vÄrÄ salikto atslÄgu ar Å”iem diviem laukiem, Å”Ädam vaicÄjumam vajadzÄtu bÅ«t diezgan vienkÄrÅ”am.
Otru alternatÄ«vu pieeju var atrast, piemÄram, ElasticSearch ritinÄÅ”anas API vai Cosmos DB ā ja pieprasÄ«jums papildus datiem atgriež Ä«paÅ”u identifikatoru, ar kuru jÅ«s varat iegÅ«t nÄkamo datu daļu. Ja Å”im identifikatoram ir neierobežots kalpoÅ”anas laiks (kÄ Comsos DB), tad tas ir lielisks veids, kÄ ieviest peidžeru ar secÄ«gu pÄreju starp lapÄm (iepriekÅ” minÄtÄ opcija Nr. 2). TÄs iespÄjamie trÅ«kumi: tas netiek atbalstÄ«ts visÄs DBVS; iegÅ«tajam nÄkamÄ gabala identifikatoram var bÅ«t ierobežots kalpoÅ”anas laiks, kas parasti nav piemÄrots lietotÄja mijiedarbÄ«bas ievieÅ”anai (piemÄram, ElasticSearch ritinÄÅ”anas API).
Sarežģīta filtrÄÅ”ana
Sarežģīsim uzdevumu vÄl vairÄk. PieÅemsim, ka ir prasÄ«ba ieviest tÄ saukto fasetÄto meklÄÅ”anu, kas ikvienam ir ļoti pazÄ«stama no interneta veikaliem. IepriekÅ” minÄtie piemÄri, kuru pamatÄ ir pasÅ«tÄ«jumu tabula, Å”ajÄ gadÄ«jumÄ nav Ä«paÅ”i ilustratÄ«vi, tÄpÄc pÄriesim uz tabulu Produkts no AdventureWorks datu bÄzes:
KÄda ir ŔķautÅu meklÄÅ”anas ideja? Fakts ir tÄds, ka katram filtra elementam tiek parÄdÄ«ts Å”im kritÄrijam atbilstoÅ”o ierakstu skaits Åemot vÄrÄ visÄs pÄrÄjÄs kategorijÄs atlasÄ«tos filtrus.
PiemÄram, ja Å”ajÄ piemÄrÄ atlasÄm kategoriju VelosipÄdi un krÄsu Melnu, tabulÄ tiks rÄdÄ«ti tikai melni velosipÄdi, bet:
Katram kritÄrijam grupÄ Kategorijas preÄu skaits no Ŕīs kategorijas tiks parÄdÄ«ts melnÄ krÄsÄ.
Katram grupas āKrÄsasā kritÄrijam tiks parÄdÄ«ts Ŕīs krÄsas velosipÄdu skaits.
Å eit ir Å”Ädu apstÄkļu rezultÄtu izvades piemÄrs:
Ja atzÄ«mÄsiet arÄ« kategoriju āApÄ£Ärbsā, tabulÄ bÅ«s redzamas arÄ« melnas drÄbes, kas ir noliktavÄ. ArÄ« melno preÄu skaits sadaÄ¼Ä āKrÄsaā tiks pÄrrÄÄ·inÄts pÄc jaunajiem nosacÄ«jumiem, tikai sadaÄ¼Ä āKategorijasā nekas nemainÄ«sies... Ceru, ka ar Å”iem piemÄriem pietiks, lai saprastu ierasto faceted meklÄÅ”anas algoritmu.
Tagad iedomÄsimies, kÄ to var Ä«stenot uz attiecÄ«bu pamata. Katrai kritÄriju grupai, piemÄram, kategorijai un krÄsai, bÅ«s nepiecieÅ”ams atseviŔķs vaicÄjums:
SELECT pc.ProductCategoryID, pc.Name, COUNT(1) FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
WHERE p.Color = 'Black'
GROUP BY pc.ProductCategoryID, pc.Name
ORDER BY COUNT(1) DESC
SELECT Color, COUNT(1) FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.ProductCategoryID = 1 --Bikes
GROUP BY Color
ORDER BY COUNT(1) DESC
Kas ir nepareizi ar Å”o risinÄjumu? Tas ir ļoti vienkÄrÅ”i ā tas nav labi mÄrogots. Katrai filtra sadaļai ir nepiecieÅ”ams atseviŔķs vaicÄjums, lai aprÄÄ·inÄtu daudzumus, un Å”ie vaicÄjumi nav no tiem vienkÄrÅ”Äkajiem. TieÅ”saistes veikalos dažÄs kategorijÄs var bÅ«t vairÄki desmiti filtru sadaļu, kas var bÅ«t nopietna veiktspÄjas problÄma.
Parasti pÄc Å”iem apgalvojumiem man tiek piedÄvÄti daži risinÄjumi, proti:
Apvienojiet visus daudzumu uzskaites vienÄ vaicÄjumÄ. Tehniski tas ir iespÄjams, izmantojot atslÄgvÄrdu UNION, taÄu tas daudz nepalÄ«dzÄs veiktspÄjai - datu bÄzei joprojÄm bÅ«s jÄizpilda katrs fragments no nulles.
KeÅ”atmiÅas daudzumi. Tas man tiek ieteikts gandrÄ«z katru reizi, kad aprakstu problÄmu. BrÄ«dinÄjums ir tÄds, ka tas parasti nav iespÄjams. PieÅemsim, ka mums ir 10 "Ŕķautnes", no kurÄm katrai ir 5 vÄrtÄ«bas. Å Ä« ir ļoti āpieticÄ«gaā situÄcija, salÄ«dzinot ar to, ko var redzÄt tajos paÅ”os interneta veikalos. Viena aspekta elementa izvÄle ietekmÄ daudzumus 9 citos, citiem vÄrdiem sakot, katrai kritÄriju kombinÄcijai daudzumi var bÅ«t atŔķirÄ«gi. MÅ«su piemÄrÄ kopÄ ir 50 kritÄriji, kurus lietotÄjs var atlasÄ«t, tÄtad iespÄjamÄs kombinÄcijas bÅ«s 250. Nav pietiekami daudz atmiÅas vai laika, lai aizpildÄ«tu Å”Ädu datu masÄ«vu. Å eit var iebilst un teikt, ka ne visas kombinÄcijas ir Ä«stas un lietotÄjs reti izvÄlas vairÄk par 5-10 kritÄrijiem. JÄ, ir iespÄjams veikt slinku ielÄdi un keÅ”atmiÅÄ saglabÄt tikai kÄdreiz atlasÄ«to daudzumu, taÄu, jo vairÄk atlases bÅ«s, jo mazÄk efektÄ«va bÅ«s Å”Äda keÅ”atmiÅa un pamanÄmÄkas bÅ«s reakcijas laika problÄmas (Ä«paÅ”i, ja datu kopa regulÄri mainÄs).
Par laimi, Å”Ädai problÄmai jau sen ir bijuÅ”i diezgan efektÄ«vi risinÄjumi, kas paredzami darbojas ar lielu datu apjomu. Jebkurai no Ŕīm opcijÄm ir jÄga sadalÄ«t aspektu pÄrrÄÄ·inu un rezultÄtu lapas saÅemÅ”anu divos paralÄlos izsaukumos uz serveri un sakÄrtot lietotÄja interfeisu tÄ, lai datu ielÄde pa aspektiem ānetraucÄā MeklÄÅ”anas rezultÄti.
PÄc iespÄjas retÄk izsauciet pilnÄ«gu āŔķautÅuā pÄrrÄÄ·inu. PiemÄram, nepÄrrÄÄ·iniet visu katru reizi, kad mainÄs meklÄÅ”anas kritÄriji, bet gan atrodiet kopÄjo rezultÄtu skaitu, kas atbilst paÅ”reizÄjiem nosacÄ«jumiem, un aiciniet lietotÄju tos parÄdÄ«t - "Atrasti 1425 ieraksti, rÄdÄ«t?" LietotÄjs var vai nu turpinÄt mainÄ«t meklÄÅ”anas vienumus, vai arÄ« noklikŔķinÄt uz pogas ārÄdÄ«tā. Tikai otrajÄ gadÄ«jumÄ tiks izpildÄ«ti visi pieprasÄ«jumi iegÅ«t rezultÄtus un pÄrrÄÄ·inÄt daudzumus visÄs āŔķautnÄsā. Å ajÄ gadÄ«jumÄ, kÄ jÅ«s viegli varat redzÄt, jums bÅ«s jÄrisina pieprasÄ«jums iegÅ«t kopÄjo rezultÄtu skaitu un tÄ optimizÄciju. Å o metodi var atrast daudzos mazos tieÅ”saistes veikalos. AcÄ«mredzot Ŕī nav panaceja Å”ai problÄmai, taÄu vienkÄrÅ”os gadÄ«jumos tas var bÅ«t labs kompromiss.
Izmantojiet meklÄtÄjprogrammas, lai atrastu rezultÄtus un saskaitÄ«tu aspektus, piemÄram, Solr, ElasticSearch, Sphinx un citus. Visi no tiem ir paredzÄti, lai izveidotu "Ŕķautnes", un to dara diezgan efektÄ«vi, pateicoties apgrieztajam indeksam. KÄ darbojas meklÄtÄjprogrammas, kÄpÄc Å”Ädos gadÄ«jumos tÄs ir efektÄ«vÄkas par vispÄrÄjas nozÄ«mes datubÄzÄm, kÄda ir prakse un kļūmes ā tÄ ir atseviŔķa raksta tÄma. Å eit vÄlos vÄrst jÅ«su uzmanÄ«bu uz to, ka meklÄtÄjprogramma nevar aizstÄt galveno datu krÄtuvi, tÄ tiek izmantota kÄ papildinÄjums: visas izmaiÅas galvenajÄ datubÄzÄ, kas ir bÅ«tiskas meklÄÅ”anai, tiek sinhronizÄtas meklÄÅ”anas rÄdÄ«tÄjÄ; MeklÄtÄjprogramma parasti mijiedarbojas tikai ar meklÄtÄjprogrammu un nepiekļūst galvenajai datubÄzei. Viens no svarÄ«gÄkajiem jautÄjumiem Å”eit ir tas, kÄ uzticami organizÄt Å”o sinhronizÄciju. Tas viss ir atkarÄ«gs no āreakcijas laikaā prasÄ«bÄm. Ja laiks starp izmaiÅÄm galvenajÄ datubÄzÄ un to āizpauÅ”anosā meklÄÅ”anÄ nav kritisks, varat izveidot pakalpojumu, kas ik pÄc dažÄm minÅ«tÄm meklÄ nesen mainÄ«tos ierakstus un indeksÄ tos. Ja vÄlaties pÄc iespÄjas Ä«sÄku reakcijas laiku, varat ieviest kaut ko lÄ«dzÄ«gu darÄ«jumu izsÅ«tne lai nosÅ«tÄ«tu atjauninÄjumus meklÄÅ”anas pakalpojumam.
Atzinumi
Servera puses peidžeru ievieÅ”ana ir ievÄrojama komplikÄcija, un tÄ ir jÄga tikai strauji augoÅ”Äm vai vienkÄrÅ”i lielÄm datu kopÄm. Nav absolÅ«ti precÄ«zas receptes, kÄ novÄrtÄt ālieloā vai āÄtri augoÅ”uā, taÄu es izvÄlÄtos Å”Ädu pieeju:
Ja pilnÄ«gas datu kolekcijas saÅemÅ”ana, Åemot vÄrÄ servera laiku un tÄ«kla pÄrraidi, parasti atbilst veiktspÄjas prasÄ«bÄm, nav jÄgas ieviest peidžeru servera pusÄ.
Var rasties situÄcija, ka tuvÄkajÄ nÄkotnÄ nav gaidÄmas veiktspÄjas problÄmas, jo datu ir maz, bet datu apkopojums nepÄrtraukti pieaug. Ja kÄda datu kopa nÄkotnÄ vairs neatbilst iepriekÅ”Äjam punktam, labÄk ir nekavÄjoties sÄkt lapoÅ”anu.
Ja uzÅÄmumam nav stingras prasÄ«bas parÄdÄ«t kopÄjo rezultÄtu skaitu vai parÄdÄ«t lappuÅ”u numurus, un jÅ«su sistÄmÄ nav meklÄtÄjprogrammas, labÄk neieviest Å”os punktus un apsvÄrt iespÄju #2.
Ja ir skaidra prasÄ«ba pÄc slÄ«pÄtas meklÄÅ”anas, jums ir divas iespÄjas, nezaudÄjot veiktspÄju.
NepÄrrÄÄ·iniet visus daudzumus katru reizi, kad mainÄs meklÄÅ”anas kritÄriji.
Izmantojiet meklÄtÄjprogrammas, piemÄram, Solr, ElasticSearch, Sphinx un citas. Bet jÄsaprot, ka tas nevar aizstÄt galveno datubÄzi, un tas ir jÄizmanto kÄ papildinÄjums galvenajai krÄtuvei meklÄÅ”anas problÄmu risinÄÅ”anai.
TurklÄt slÄ«pÄtas meklÄÅ”anas gadÄ«jumÄ ir lietderÄ«gi sadalÄ«t meklÄÅ”anas rezultÄtu lapas izguvi un skaitÄ«Å”anu divos paralÄlos pieprasÄ«jumos. Daudzumu skaitÄ«Å”ana var aizÅemt ilgÄku laiku nekÄ rezultÄtu iegÅ«Å”ana, savukÄrt rezultÄti lietotÄjam ir svarÄ«gÄki.
Ja meklÄÅ”anai izmantojat SQL datu bÄzi, visas ar Å”o daļu saistÄ«tÄs koda izmaiÅas ir rÅ«pÄ«gi jÄpÄrbauda, āāvai tÄs darbojas atbilstoÅ”Ä datu daudzumÄ (pÄrsniedzot reÄllaika datubÄzes apjomu). Ieteicams arÄ« izmantot vaicÄjuma izpildes laika uzraudzÄ«bu visos datu bÄzes gadÄ«jumos, un jo Ä«paÅ”i ādzÄ«vajÄā. Pat ja izstrÄdes stadijÄ ar vaicÄjumu plÄniem viss bija kÄrtÄ«bÄ, pieaugot datu apjomam, situÄcija var manÄmi mainÄ«ties.