Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

Wieħed mix-xenarji tipiċi fl-applikazzjonijiet kollha li aħna familjari magħhom huwa li nfittxu dejta skont ċerti kriterji u li nuruha f'forma faċli biex tinqara. Jista' jkun hemm ukoll għażliet addizzjonali għall-issortjar, ir-raggruppament u l-paging. Il-kompitu huwa, fit-teorija, trivjali, iżda meta jsolvuha, ħafna żviluppaturi jagħmlu għadd ta 'żbalji, li aktar tard jikkawżaw li l-produttività tbati. Ejja nippruvaw nikkunsidraw diversi għażliet biex issolvi din il-problema u nifformulaw rakkomandazzjonijiet għall-għażla tal-implimentazzjoni l-aktar effettiva.

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

Għażla ta' paging #1

L-iktar għażla sempliċi li tiġi f'moħħna hija wirja paġna b'paġna tar-riżultati tat-tfittxija fl-aktar forma klassika tagħha.

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni
Ejja ngħidu li l-applikazzjoni tiegħek tuża database relazzjonali. F'dan il-każ, biex turi informazzjoni f'din il-formola, ser ikollok bżonn tmexxi żewġ mistoqsijiet SQL:

  • Ikseb ringieli għall-paġna kurrenti.
  • Ikkalkula n-numru totali ta 'linji li jikkorrispondu mal-kriterji ta' tfittxija - dan huwa meħtieġ biex jintwerew paġni.

Ejja nħarsu lejn l-ewwel mistoqsija billi tuża database tat-test MS SQL bħala eżempju AdventureWorks għal server 2016. Għal dan il-għan se nużaw it-tabella Sales.SalesOrderHeader:

SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

Il-mistoqsija ta 'hawn fuq se tirritorna l-ewwel 50 ordni mil-lista, magħżula skond id-data dixxendenti taż-żieda, fi kliem ieħor, l-aktar 50 ordni riċenti.

Din taħdem malajr fuq il-bażi tat-test, iżda ejja nħarsu lejn il-pjan ta 'eżekuzzjoni u l-istatistika I/O:

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

Table 'SalesOrderHeader'. Scan count 1, logical reads 698, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Tista' tikseb statistika I/O għal kull mistoqsija billi tħaddem il-kmand SET STATISTICS IO ON fir-runtime tal-mistoqsija.

Kif tistgħu taraw mill-pjan ta 'eżekuzzjoni, l-iktar għażla li tuża r-riżorsi hija li tissortja r-ringieli kollha tat-tabella tas-sors skond id-data miżjuda. U l-problema hija li aktar ma jidhru ringieli fit-tabella, iktar ikun "diffiċli" l-issortjar. Fil-prattika, sitwazzjonijiet bħal dawn għandhom jiġu evitati, allura ejja nżidu indiċi mad-data taż-żieda u naraw jekk il-konsum tar-riżorsi nbidilx:

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

Table 'SalesOrderHeader'. Scan count 1, logical reads 165, physical reads 0, read-ahead reads 5, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Ovvjament marret ħafna aħjar. Imma l-problemi kollha huma solvuti? Ejja nbiddlu l-mistoqsija biex tfittex ordnijiet fejn l-ispiża totali tal-merkanzija taqbeż $100:

SELECT * FROM Sales.SalesOrderHeader
WHERE SubTotal > 100
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

Table 'SalesOrderHeader'. Scan count 1, logical reads 1081, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Għandna sitwazzjoni umoristiċi: il-pjan ta 'mistoqsija mhuwiex ħafna agħar minn dak ta' qabel, iżda n-numru attwali ta 'qari loġiku huwa kważi d-doppju ta' skannjar ta 'tabella sħiħa. Hemm mod kif toħroġ - jekk nagħmlu indiċi kompost minn indiċi diġà eżistenti u nżidu l-prezz totali tal-merkanzija bħala t-tieni qasam, nerġgħu nġibu 165 qari loġiku:

CREATE INDEX IX_SalesOrderHeader_OrderDate_SubTotal on Sales.SalesOrderHeader(OrderDate, SubTotal);

Din is-sensiela ta’ eżempji tista’ titkompla għal żmien twil, iżda ż-żewġ ħsibijiet ewlenin li rrid nesprimi hawn huma:

  • Iż-żieda ta' kwalunkwe kriterju ġdid jew ordni ta' għażla għal mistoqsija ta' tfittxija jista' jkollha impatt sinifikanti fuq il-veloċità tal-mistoqsija ta' tfittxija.
  • Imma jekk irridu nnaqqsu biss parti mid-data, u mhux ir-riżultati kollha li jaqblu mat-termini tat-tfittxija, hemm ħafna modi kif itejb tali mistoqsija.

Issa ejja ngħaddu għat-tieni mistoqsija msemmija fil-bidu nett - dik li tgħodd in-numru ta 'rekords li jissodisfaw il-kriterju tat-tfittxija. Ejja nieħdu l-istess eżempju - infittxu ordnijiet li huma aktar minn $100:

SELECT COUNT(1) FROM Sales.SalesOrderHeader
WHERE SubTotal > 100

Minħabba l-indiċi kompost indikat hawn fuq, niksbu:

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

Table 'SalesOrderHeader'. Scan count 1, logical reads 698, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Il-fatt li l-mistoqsija tgħaddi mill-indiċi kollu mhuwiex sorprendenti, peress li l-qasam SubTotal mhuwiex fl-ewwel pożizzjoni, għalhekk il-mistoqsija ma tistax tużah. Il-problema tissolva billi żżid indiċi ieħor fuq il-qasam SubTotal, u bħala riżultat tagħti biss 48 qari loġiku.

Tista' tagħti ftit eżempji oħra ta' talbiet għall-għadd tal-kwantitajiet, iżda l-essenza tibqa' l-istess: li tirċievi biċċa dejta u li tgħodd l-ammont totali huma żewġ talbiet fundamentalment differenti, u kull wieħed jeħtieġ il-miżuri tiegħu stess għall-ottimizzazzjoni. B'mod ġenerali, ma tkunx tista' ssib taħlita ta' indiċi li taħdem tajjeb bl-istess mod għaż-żewġ mistoqsijiet.

Għaldaqstant, wieħed mir-rekwiżiti importanti li għandu jiġi ċċarat meta tiġi żviluppata soluzzjoni ta 'tfittxija bħal din hija jekk huwiex verament importanti għal negozju li jara n-numru totali ta' oġġetti misjuba. Ħafna drabi jiġri li le. U n-navigazzjoni b'numri ta' paġna speċifiċi, fl-opinjoni tiegħi, hija soluzzjoni b'ambitu dejjaq ħafna, peress li l-biċċa l-kbira tax-xenarji ta 'paging jidhru bħal "mur fil-paġna li jmiss."

Għażla ta' paging #2

Ejja nassumu li l-utenti ma jimpurtahomx li jkunu jafu n-numru totali ta 'oġġetti misjuba. Ejja nippruvaw nissimplifikaw il-paġna tat-tfittxija:

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni
Fil-fatt, l-unika ħaġa li nbidlet hija li m'hemm l-ebda mod kif wieħed jinnaviga għal numri ta 'paġna speċifiċi, u issa din it-tabella m'għandhiex bżonn tkun taf kemm jista' jkun hemm sabiex turiha. Iżda tqum il-mistoqsija - it-tabella kif taf jekk hemmx data għall-paġna li jmiss (sabiex turi b'mod korrett il-link "Li jmiss")?

It-tweġiba hija sempliċi ħafna: tista 'taqra mid-database rekord wieħed aktar milli huwa meħtieġ għall-wiri, u l-preżenza ta' dan ir-rekord "addizzjonali" turi jekk hemmx porzjon li jmiss. B'dan il-mod, għandek bżonn biss tmexxi talba waħda biex tikseb paġna waħda ta 'dejta, li ttejjeb b'mod sinifikanti l-prestazzjoni u tagħmilha aktar faċli biex tappoġġja tali funzjonalità. Fil-prattika tiegħi, kien hemm każ meta rrifjutat li tgħodd in-numru totali ta 'rekords tħaffef il-kunsinna tar-riżultati b'4-5 darbiet.

Hemm diversi għażliet ta 'interface tal-utent għal dan l-approċċ: kmandi "lura" u "quddiem", bħal fl-eżempju ta' hawn fuq, buttuna "tagħbija aktar", li sempliċement iżżid porzjon ġdid mar-riżultati murija, "iscroll infinit", li taħdem fuq il-prinċipju ta ' "tagħbija aktar" ", iżda s-sinjal biex tikseb il-porzjon li jmiss huwa għall-utent biex tiskrollja r-riżultati kollha murija sa l-aħħar. Tkun xi tkun is-soluzzjoni viżwali, il-prinċipju tat-teħid ta 'kampjuni tad-dejta jibqa' l-istess.

Sfumaturi ta 'implimentazzjoni ta' paging

L-eżempji kollha ta' mistoqsijiet mogħtija hawn fuq jużaw l-approċċ "offset + count", meta l-mistoqsija nnifisha tispeċifika f'liema ordni r-ringieli tar-riżultat u kemm iridu jintbagħtu lura. L-ewwel, ejja nħarsu lejn kif l-aħjar torganizza l-passaġġ tal-parametri f'dan il-każ. Fil-prattika, iltqajt ma' diversi metodi:

  • In-numru tas-serje tal-paġna mitluba (pageIndex), id-daqs tal-paġna (pageSize).
  • In-numru tas-serje tal-ewwel rekord li għandu jintbagħat lura (startIndex), in-numru massimu ta' rekords fir-riżultat (għadd).
  • In-numru tas-sekwenza tal-ewwel rekord li jrid jintbagħat lura (startIndex), in-numru tas-sekwenza tal-aħħar rekord li jrid jintbagħat (endIndex).

L-ewwel daqqa t'għajn jista' jidher li dan huwa tant elementari li m'hemm l-ebda differenza. Iżda dan mhux hekk - l-iktar għażla konvenjenti u universali hija t-tieni (startIndex, għadd). Hemm diversi raġunijiet għal dan:

  • Għall-approċċ ta' qari tal-provi ta' +1 ta' dħul mogħti hawn fuq, l-ewwel għażla b'pageIndex u pageSize hija estremament inkonvenjenti. Pereżempju, irridu nuru 50 post għal kull paġna. Skont l-algoritmu ta 'hawn fuq, għandek bżonn taqra rekord wieħed aktar milli meħtieġ. Jekk dan "+1" ma jiġix implimentat fuq is-server, jirriżulta li għall-ewwel paġna għandna nitolbu rekords minn 1 sa 51, għat-tieni - minn 51 sa 101, eċċ. Jekk tispeċifika daqs tal-paġna ta' 51 u żżid pageIndex, allura t-tieni paġna terġa' lura minn 52 għal 102, eċċ. Għaldaqstant, fl-ewwel għażla, l-uniku mod biex tiġi implimentata sew buttuna biex tmur fil-paġna li jmiss huwa li s-server jaqra l-prova tal-linja "extra", li se tkun sfumatura impliċita ħafna.
  • It-tielet għażla ma tagħmel sens xejn, peress li biex tmexxi mistoqsijiet fil-biċċa l-kbira tad-databases xorta jkollok bżonn tgħaddi l-għadd aktar milli l-indiċi tal-aħħar rekord. It-tnaqqis ta' startIndex minn endIndex jista' jkun operazzjoni aritmetika sempliċi, iżda hawnhekk hija superfluwa.

Issa għandna niddeskrivu l-iżvantaġġi tal-implimentazzjoni tal-paging permezz ta '"offset + kwantità":

  • L-irkupru ta 'kull paġna sussegwenti se jkun aktar għali u aktar bil-mod minn dik ta' qabel, minħabba li d-database xorta se jkollha tgħaddi mir-rekords kollha "mill-bidu" skont il-kriterji ta 'tfittxija u għażla, u mbagħad tieqaf fil-framment mixtieq.
  • Mhux id-DBMSs kollha jistgħu jappoġġjaw dan l-approċċ.

Hemm alternattivi, iżda huma wkoll imperfetti. L-ewwel minn dawn l-approċċi jissejjaħ "keyset paging" jew "seek method" u huwa kif ġej: wara li tirċievi porzjon, tista 'tiftakar il-valuri tal-qasam fl-aħħar rekord fuq il-paġna, u mbagħad tużahom biex tikseb il-porzjon li jmiss. Pereżempju, għamilna l-mistoqsija li ġejja:

SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

U fl-aħħar rekord sibna l-valur tad-data tal-ordni '2014-06-29'. Imbagħad biex tikseb il-paġna li jmiss tista' tipprova tagħmel dan:

SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate < '2014-06-29'
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

Il-problema hija li OrderDate hija qasam mhux uniku u l-kundizzjoni speċifikata hawn fuq x'aktarx titlef ħafna ringieli meħtieġa. Biex iżżid mhux ambigwità għal din il-mistoqsija, trid iżżid qasam uniku mal-kundizzjoni (assumi li 75074 huwa l-aħħar valur taċ-ċavetta primarja mill-ewwel porzjon):

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

Din l-għażla se taħdem b'mod korrett, iżda b'mod ġenerali se jkun diffiċli li tiġi ottimizzata peress li l-kundizzjoni fiha operatur OR. Jekk il-valur taċ-ċavetta primarja jiżdied hekk kif tiżdied id-Data tal-Ordni, allura l-kundizzjoni tista’ tiġi ssimplifikata billi jitħalla biss filtru minn SalesOrderID. Imma jekk ma jkun hemm l-ebda korrelazzjoni stretta bejn il-valuri taċ-ċavetta primarja u l-qasam li bih jiġi magħżul ir-riżultat, dan OR ma jistax jiġi evitat fil-biċċa l-kbira tad-DBMSs. Eċċezzjoni li naf biha hija PostgreSQL, li jappoġġja bis-sħiħ it-tqabbil tat-tuple, u l-kundizzjoni ta' hawn fuq tista' tinkiteb bħala "FEJN (OrderDate, SalesOrderID) <('2014-06-29', 75074)". Minħabba ċavetta komposta b'dawn iż-żewġ oqsma, mistoqsija bħal din għandha tkun pjuttost faċli.

It-tieni approċċ alternattiv jista’ jinstab, pereżempju, fi ElasticSearch scroll API jew Cosmos DB — meta talba, minbarra d-dejta, tirritorna identifikatur speċjali li bih tista’ tikseb il-porzjon ta’ dejta li jmiss. Jekk dan l-identifikatur għandu ħajja illimitata (bħal f'Comsos DB), allura dan huwa mod tajjeb ħafna biex timplimenta paging bi tranżizzjoni sekwenzjali bejn il-paġni (għażla #2 msemmija hawn fuq). L-iżvantaġġi possibbli tiegħu: mhuwiex appoġġjat fid-DBMSs kollha; l-identifikatur tal-biċċa li jmiss li jirriżulta jista 'jkollu ħajja limitata, li ġeneralment mhix adattata għall-implimentazzjoni tal-interazzjoni tal-utent (bħall-iscroll API ElasticSearch).

Iffiltrar kumpless

Ejja nikkomplikaw aktar il-kompitu. Ejja ngħidu li hemm rekwiżit li tiġi implimentata l-hekk imsejħa tfittxija faceted, li hija familjari ħafna għal kulħadd mill-ħwienet online. L-eżempji ta 'hawn fuq ibbażati fuq it-tabella tal-ordnijiet mhumiex illustrattivi ħafna f'dan il-każ, allura ejja naqilbu għat-tabella tal-Prodott mid-database AdventureWorks:

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni
X'inhi l-idea wara t-tfittxija b'aspetti? Il-fatt hu li għal kull element ta 'filtru jintwera n-numru ta' rekords li jissodisfaw dan il-kriterju filwaqt li jitqiesu l-filtri magħżula fil-kategoriji l-oħra kollha.

Pereżempju, jekk nagħżlu l-kategorija Bikes u l-kulur Iswed f'dan l-eżempju, it-tabella turi biss roti suwed, iżda:

  • Għal kull kriterju fil-grupp Kategoriji, in-numru ta' prodotti minn dik il-kategorija se jintwera bl-iswed.
  • Għal kull kriterju tal-grupp "Kuluri", in-numru ta 'roti ta' dan il-kulur se jintwera.

Hawn hu eżempju tal-output tar-riżultat għal kundizzjonijiet bħal dawn:

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni
Jekk tiċċekkja wkoll il-kategorija "Ħwejjeġ", it-tabella turi wkoll ħwejjeġ suwed li huma fl-istokk. In-numru ta 'prodotti suwed fit-taqsima "Kulur" se jiġi kkalkulat mill-ġdid ukoll skont il-kundizzjonijiet il-ġodda, biss fit-taqsima "Kategoriji" ma jinbidel xejn... Nittama li dawn l-eżempji huma biżżejjed biex tifhem l-algoritmu ta' tfittxija b'aspetti tas-soltu.

Issa ejja nimmaġinaw kif dan jista' jiġi implimentat fuq bażi relazzjonali. Kull grupp ta' kriterji, bħall-Kategorija u l-Kulur, jeħtieġ mistoqsija separata:

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

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni

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

Fittex riżultati output u kwistjonijiet ta 'prestazzjoni
X'hemm ħażin f'din is-soluzzjoni? Huwa sempliċi ħafna - ma tiskalax tajjeb. Kull sezzjoni tal-filtru teħtieġ mistoqsija separata biex tikkalkula l-kwantitajiet, u dawn il-mistoqsijiet mhumiex l-aktar faċli. Fil-ħwienet online, xi kategoriji jista 'jkollhom diversi għexieren ta' sezzjonijiet tal-filtri, li jistgħu jkunu kwistjoni serja ta 'prestazzjoni.

Normalment wara dawn id-dikjarazzjonijiet niġi offrut xi soluzzjonijiet, jiġifieri:

  • Għaqqad l-għadd tal-kwantità kollha f'mistoqsija waħda. Teknikament dan huwa possibbli bl-użu tal-keyword UNION, iżda mhux se jgħin ħafna fil-prestazzjoni - id-database xorta se jkollha tesegwixxi kull wieħed mill-frammenti mill-bidu.
  • Il-kwantitajiet tal-cache. Dan huwa ssuġġerit lili kważi kull darba li niddeskrivi problema. It-twissija hija li dan huwa ġeneralment impossibbli. Ejja ngħidu li għandna 10 "faċċati", li kull wieħed minnhom għandu 5 valuri. Din hija sitwazzjoni "modesta" ħafna meta mqabbla ma 'dak li jista' jidher fl-istess ħwienet online. L-għażla ta' element ta' aspett wieħed taffettwa l-kwantitajiet f'9 oħrajn, fi kliem ieħor, għal kull kombinazzjoni ta' kriterji l-kwantitajiet jistgħu jkunu differenti. Fl-eżempju tagħna, hemm total ta 'kriterji 50 li l-utent jista' jagħżel, għalhekk, se jkun hemm kombinazzjonijiet possibbli 250. M'hemmx biżżejjed memorja jew ħin biex timla tali firxa ta 'data. Hawnhekk tista 'toġġezzjona u tgħid li mhux il-kombinazzjonijiet kollha huma reali u l-utent rarament jagħżel aktar minn 5-10 kriterji. Iva, huwa possibbli li tagħmel tagħbija għażżien u cache kwantità biss ta 'dak li qatt intgħażel, iżda aktar ma jkun hemm selezzjonijiet, inqas ikun effiċjenti tali cache u aktar se jkunu notevoli l-problemi tal-ħin tar-rispons (speċjalment jekk il- is-sett tad-dejta jinbidel regolarment).

Fortunatament, problema bħal din ilha li kellha soluzzjonijiet pjuttost effettivi li jaħdmu b'mod prevedibbli fuq volumi kbar ta 'dejta. Għal kwalunkwe waħda minn dawn l-għażliet, jagħmel sens li taqsam il-kalkolu mill-ġdid tal-aspetti u li tirċievi l-paġna tar-riżultati f'żewġ sejħiet paralleli lis-server u torganizza l-interface tal-utent b'tali mod li t-tagħbija tad-dejta mill-aspetti "ma tfixkilx" mal-wiri ta ' riżultati tat-tfittxija.

  • Sejħa kalkolu mill-ġdid sħiħ ta '"aspetti" kemm jista' jkun rari. Pereżempju, tikkalkulax kollox mill-ġdid kull darba li l-kriterji tat-tfittxija jinbidel, iżda minflok sib in-numru totali ta’ riżultati li jaqblu mal-kundizzjonijiet attwali u ħeġġeġ lill-utent biex jurihom - "1425 rekord misjuba, juru?" L-utent jista' jew ikompli jibdel it-termini tat-tfittxija jew ikklikkja l-buttuna "uri". Fit-tieni każ biss se jiġu eżegwiti t-talbiet kollha biex jinkisbu riżultati u jiġu kkalkulati mill-ġdid il-kwantitajiet fuq "l-aspetti" kollha. F'dan il-każ, kif tistgħu taraw faċilment, ser ikollok tittratta talba biex tikseb in-numru totali ta 'riżultati u l-ottimizzazzjoni tagħha. Dan il-metodu jista 'jinstab f'ħafna ħwienet żgħar online. Ovvjament, din mhix rimedju għal din il-problema, iżda f'każijiet sempliċi jista 'jkun kompromess tajjeb.
  • Uża magni tat-tiftix biex issib riżultati u tgħodd aspetti, bħal Solr, ElasticSearch, Sphinx u oħrajn. Kollha kemm huma mfassla biex jibnu "aspetti" u jagħmlu dan b'mod pjuttost effiċjenti minħabba l-indiċi maqlub. Kif jaħdmu l-magni tat-tiftix, għaliex f'każijiet bħal dawn huma aktar effettivi minn databases għal skopijiet ġenerali, liema prattiki u nases hemm - dan huwa suġġett għal artiklu separat. Hawnhekk nixtieq niġbed l-attenzjoni tiegħek għall-fatt li l-magna tat-tiftix ma tistax tkun sostitut għall-ħażna tad-data prinċipali; tintuża bħala żieda: kwalunkwe tibdil fid-database prinċipali li huwa rilevanti għat-tfittxija huwa sinkronizzat fl-indiċi tat-tfittxija; Il-magna tat-tiftix normalment tinteraġixxi biss mal-magna tat-tiftix u ma taċċessax id-database prinċipali. Wieħed mill-aktar punti importanti hawnhekk huwa kif torganizza din is-sinkronizzazzjoni b'mod affidabbli. Dan kollu jiddependi fuq ir-rekwiżiti tal-"ħin ta 'reazzjoni". Jekk iż-żmien bejn bidla fid-database prinċipali u "manifestazzjoni" tagħha fit-tfittxija ma jkunx kritiku, tista 'toħloq servizz li jfittex għal rekords mibdula reċentement kull ftit minuti u jindikahom. Jekk trid l-iqsar ħin ta 'rispons possibbli, tista' timplimenta xi ħaġa simili kaxxa tal-ħruġ transazzjonali biex tibgħat aġġornamenti lis-servizz tat-tiftix.

Sejbiet

  1. L-implimentazzjoni ta' paging fuq is-server hija kumplikazzjoni sinifikanti u tagħmel sens biss għal settijiet ta' data li qed jikbru malajr jew sempliċement kbar. M'hemm l-ebda riċetta assolutament eżatta dwar kif tevalwa "kbir" jew "li qed jikbru malajr", imma nsegwi dan l-approċċ:
    • Jekk tirċievi ġabra sħiħa ta 'dejta, b'kont meħud tal-ħin tas-server u t-trażmissjoni tan-netwerk, taqbel mal-ħtiġiet tal-prestazzjoni normalment, m'hemm l-ebda punt fl-implimentazzjoni tal-paging fuq in-naħa tas-server.
    • Jista 'jkun hemm sitwazzjoni fejn ma huma mistennija l-ebda problemi ta' prestazzjoni fil-futur qarib, peress li hemm ftit dejta, iżda l-ġbir tad-dejta qiegħed dejjem jikber. Jekk xi sett ta 'dejta fil-futur jista' ma jibqax jissodisfa l-punt ta 'qabel, huwa aħjar li tibda paging minnufih.
  2. Jekk ma jkun hemm l-ebda rekwiżit strett min-naħa tan-negozju li juri n-numru totali ta 'riżultati jew li juri n-numri tal-paġna, u s-sistema tiegħek ma jkollhiex magna tat-tiftix, huwa aħjar li ma timplimentax dawn il-punti u tikkunsidra l-għażla #2.
  3. Jekk hemm rekwiżit ċar għal tfittxija b'aspetti, għandek żewġ għażliet mingħajr ma tissagrifika l-prestazzjoni:
    • Tikkalkulax mill-ġdid il-kwantitajiet kollha kull darba li l-kriterji tat-tfittxija jinbidlu.
    • Uża magni tat-tiftix bħal Solr, ElasticSearch, Sphinx u oħrajn. Iżda għandu jiġi mifhum li ma jistax ikun sostitut għad-database prinċipali, u għandu jintuża bħala żieda mal-ħażna ewlenija biex issolvi problemi ta 'tfittxija.
  4. Ukoll, fil-każ ta 'tfittxija b'aspetti, jagħmel sens li l-irkupru tal-paġna tar-riżultati tat-tiftix u l-għadd jinqasam f'żewġ talbiet paralleli. L-għadd tal-kwantitajiet jista 'jieħu aktar żmien milli jikseb ir-riżultati, filwaqt li r-riżultati huma aktar importanti għall-utent.
  5. Jekk qed tuża database SQL għat-tiftix, kwalunkwe bidla fil-kodiċi relatata ma 'din il-parti għandha tiġi ttestjata sew għall-prestazzjoni fuq l-ammont xieraq ta' data (li jaqbeż il-volum fid-database ħaj). Huwa wkoll rakkomandabbli li tuża l-monitoraġġ tal-ħin tal-eżekuzzjoni tal-mistoqsijiet fuq l-istanzi kollha tad-database, u speċjalment fuq dik "ħaj". Anke jekk kollox kien tajjeb bil-pjanijiet ta 'mistoqsijiet fl-istadju tal-iżvilupp, hekk kif il-volum tad-dejta jikber, is-sitwazzjoni tista' tinbidel b'mod notevoli.

Sors: www.habr.com

Żid kumment