Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш

Яке аз сенарияҳои маъмулӣ дар ҳама барномаҳое, ки мо бо онҳо шинос ҳастем, ҷустуҷӯи маълумот аз рӯи меъёрҳои муайян ва намоиш додани он дар шакли осон хондан мебошад. Инчунин мумкин аст имконоти иловагӣ барои ҷудокунӣ, гурӯҳбандӣ ва пейджинг вуҷуд дошта бошанд. Вазифа, аз чихати назария, ночиз аст, вале хангоми халли он бисьёр кор-гарон ба як катор хатогихо рох медиханд, ки баъдтар боиси паст шудани хосилнокии мехнат мегардад. Биёед кӯшиш кунем, ки вариантҳои гуногуни ҳалли ин мушкилотро баррасӣ кунем ва тавсияҳоро барои интихоби самараноктарин татбиқ кунем.

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш

Варианти пейджинг №1

Варианти соддатарине, ки ба хотир меояд, ин намоиши саҳифа ба саҳифаи натиҷаҳои ҷустуҷӯ дар шакли классикии он мебошад.

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш
Фарз мекунем, ки барномаи шумо пойгоҳи додаҳои релятсионӣ истифода мебарад. Дар ин ҳолат, барои намоиш додани маълумот дар ин шакл, шумо бояд ду дархости SQL-ро иҷро кунед:

  • Барои саҳифаи ҷорӣ сатрҳо гиред.
  • Шумораи умумии сатрҳои мувофиқи меъёрҳои ҷустуҷӯро ҳисоб кунед - ин барои намоиши саҳифаҳо зарур аст.

Биёед дархости аввалро бо истифода аз базаи санҷишии MS SQL ҳамчун намуна бубинем AdventureWorks барои сервер 2016. Барои ин мо ҷадвали Sales.SalesOrderHeader-ро истифода мебарем:

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

Дархости дар боло овардашуда 50 фармоиши аввалро аз рӯйхат, ки аз рӯи санаи камшавии илова, ба ибораи дигар, 50 фармоиши охирин мураттаб карда мешавад, бармегардонад.

Он дар базаи санҷишӣ зуд кор мекунад, аммо биёед ба нақшаи иҷро ва омори воридот / баромад назар кунем:

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш

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.

Шумо метавонед омори I/O-ро барои ҳар як дархост тавассути иҷро кардани фармони SET STATISTICS IO ON дар вақти иҷрои дархост дастрас кунед.

Тавре ки шумо аз нақшаи иҷро мебинед, варианти аз ҳама серталаб ин мураттаб кардани ҳамаи сатрҳои ҷадвали манбаъ аз рӯи санаи иловашуда мебошад. Ва мушкилот дар он аст, ки дар ҷадвал ҳар қадар сатрҳо бештар пайдо шаванд, ҷудокунӣ ҳамон қадар "мушкилтар" мешавад. Дар амал, аз чунин ҳолатҳо пешгирӣ кардан лозим аст, бинобар ин биёед ба санаи илова индекс илова кунем ва бубинем, ки истеъмоли захираҳо тағир ёфтааст:

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш

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.

Аён аст, ки он хеле беҳтар шудааст. Аммо оё ҳама мушкилот ҳал шудаанд? Биёед дархостро барои ҷустуҷӯи фармоишҳое иваз кунем, ки арзиши умумии мол аз 100 доллар зиёд бошад:

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

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш

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.

Мо вазъияти хандаовар дорем: нақшаи дархост аз нақшаи қаблӣ чандон бадтар нест, аммо шумораи воқеии хондани мантиқӣ назар ба сканкунии пурраи ҷадвал тақрибан ду баробар зиёд аст. Роҳи халосӣ вуҷуд дорад - агар мо аз индекси аллакай мавҷудбуда индекси таркибӣ созем ва арзиши умумии молро ба майдони дуюм илова кунем, мо боз 165 хондани мантиқӣ мегирем:

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

Ин силсилаи мисолҳоро метавон муддати тӯлонӣ идома дод, аммо ду андешаи асосие, ки мехоҳам дар ин ҷо баён кунам:

  • Илова кардани ҳама гуна меъёр ё тартиби нав ба дархости ҷустуҷӯ метавонад ба суръати дархости ҷустуҷӯ таъсири назаррас расонад.
  • Аммо агар ба мо лозим ояд, ки танҳо як қисми маълумотро хориҷ кунем, на ҳама натиҷаҳое, ки ба истилоҳҳои ҷустуҷӯ мувофиқат мекунанд, роҳҳои зиёде барои оптимизатсияи чунин дархост вуҷуд доранд.

Акнун биёед ба дархости дуюме, ки дар аввал зикр гардид, мегузарем - он саволе, ки шумораи сабтҳоро ҳисоб мекунад, ки ба меъёри ҷустуҷӯ мувофиқат мекунанд. Биёед як мисолро гирем - ҷустуҷӯи фармоишҳое, ки аз 100 доллар зиёданд:

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

Бо назардошти индекси таркибии дар боло зикршуда, мо мегирем:

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш

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.

Далели он, ки дархост аз тамоми индекс мегузарад, тааҷҷубовар нест, зеро майдони SubTotal дар ҷои аввал нест, бинобар ин дархост онро истифода бурда наметавонад. Масъала бо илова кардани индекси дигар дар майдони SubTotal ҳал карда мешавад ва дар натиҷа он танҳо 48 хондани мантиқӣ медиҳад.

Шумо метавонед боз чанд мисоли дархостҳоро барои ҳисоб кардани миқдорҳо диҳед, аммо моҳият як хел мемонад: гирифтани як пораи маълумот ва ҳисоб кардани маблағи умумӣ ду дархости куллан гуногун мебошанд, ва ҳар як чораҳои худро барои оптимизатсия талаб мекунад. Умуман, шумо наметавонед маҷмӯи индексҳоро, ки барои ҳарду дархост баробар кор мекунанд, пайдо кунед.

Аз ин рӯ, яке аз талаботҳои муҳиме, ки ҳангоми таҳияи чунин ҳалли ҷустуҷӯ бояд равшан карда шавад, ин аст, ки оё дидани шумораи умумии объектҳои ёфтшуда барои тиҷорат воқеан муҳим аст. Аксар вақт чунин мешавад, ки не. Ва паймоиш аз рӯи рақамҳои мушаххаси саҳифа, ба андешаи ман, як ҳалли дорои доираи хеле танг аст, зеро аксари сенарияҳои пейджинг ба "ба саҳифаи навбатӣ гузаштан" монанданд.

Варианти пейджинг №2

Фарз мекунем, ки корбарон аз донистани шумораи умумии объектҳои ёфтшуда парво надоранд. Биёед кӯшиш кунем, ки саҳифаи ҷустуҷӯро содда кунем:

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш
Дар асл, ягона чизе, ки тағйир ёфтааст, ин аст, ки ҳеҷ гуна роҳе барои гузаштан ба рақамҳои мушаххаси саҳифа вуҷуд надорад ва ҳоло ин ҷадвал лозим нест, ки барои намоиш додани он чанд нафарро донист. Аммо савол ба миён меояд - ҷадвал аз куҷо медонад, ки маълумот барои саҳифаи оянда мавҷуд аст (барои дуруст нишон додани истиноди "Оянда")?

Ҷавоб хеле оддӣ аст: шумо метавонед аз пойгоҳи додаҳо як сабти бештареро хонед, ки барои намоиш лозим аст ва мавҷудияти ин сабти "иловагӣ" нишон медиҳад, ки қисми навбатӣ вуҷуд дорад. Бо ин роҳ, шумо бояд танҳо як дархостро иҷро кунед, то як саҳифаи маълумот ба даст оред, ки ин корро ба таври назаррас беҳтар мекунад ва дастгирии чунин функсияҳоро осон мекунад. Дар амалияи ман ходисае руй дод, ки аз хисоб кардани микдори умумии кайдхо 4—5 баробар тезондани нати-чахоро рад кард.

Якчанд вариантҳои интерфейси корбар барои ин равиш вуҷуд доранд: фармонҳои "бозгашт" ва "ба пеш", ба монанди дар мисоли боло, тугмаи "бештар бор кардан", ки танҳо ба натиҷаҳои намоишшуда як қисми нав илова мекунад, "ҳаракати беохир", ки кор мекунад аз рӯи принсипи "бор бештар" ", аммо сигнал барои гирифтани қисми навбатӣ барои корбар ин аст, ки ҳамаи натиҷаҳои намоишшударо то охир паймоиш кунад. Новобаста аз ҳалли визуалӣ, принсипи интихоби маълумот бетағйир мемонад.

Нозукиҳои татбиқи пейджинг

Ҳама мисолҳои пурсишҳои дар боло овардашуда равиши "офсет + ҳисоб"-ро истифода мебаранд, вақте ки худи дархост бо кадом тартиб сатрҳои натиҷа ва чанд сатрро баргардонидан лозим аст. Аввалан, биёед бубинем, ки дар ин ҳолат интиқоли параметрҳоро чӣ гуна беҳтар ташкил кардан мумкин аст. Дар амал, ман якчанд усулҳоро дидам:

  • Рақами силсилавии саҳифаи дархостшуда (pageIndex), андозаи саҳифа (pageSize).
  • Рақами силсилавии сабти аввалине, ки баргардонида мешавад (startIndex), шумораи максималии сабтҳо дар натиҷа (шумор).
  • Рақами пайдарпаии сабти аввалини баргардонидашаванда (startIndex), рақами пайдарпаии сабти охирини баргардонидашаванда (endIndex).

Дар назари аввал чунин ба назар мерасад, ки ин хеле ибтидоӣ аст, ки ҳеҷ фарқияте вуҷуд надорад. Аммо ин тавр нест - варианти мувофиқтарин ва универсалӣ дуюм аст (startIndex, count). Барои ин якчанд сабаб вуҷуд дорад:

  • Барои равиши таҳрири сабти +1, ки дар боло оварда шудааст, варианти аввал бо pageIndex ва pageSize бениҳоят нороҳат аст. Масалан, мо мехоҳем дар як саҳифа 50 хабарро намоиш диҳем. Мувофиқи алгоритми дар боло овардашуда, шумо бояд як сабти бештар аз заруриро хонед. Агар ин "+1" дар сервер иҷро нашавад, маълум мешавад, ки барои саҳифаи аввал мо бояд сабтҳоро аз 1 то 51, барои дуюм - аз 51 то 101 ва ғайра дархост кунем. Агар шумо андозаи саҳифаро 51 муайян кунед ва pageIndex-ро зиёд кунед, пас саҳифаи дуюм аз 52 то 102 бармегардад ва ғайра. Мутаносибан, дар варианти аввал, ягона роҳи дурусти татбиқи тугма барои гузаштан ба саҳифаи навбатӣ ин аст, ки сервер хати “иловагӣ”-ро тафтиш кунад, ки ин як нозуки хеле номуайян хоҳад буд.
  • Варианти сеюм тамоман маъно надорад, зеро барои иҷро кардани дархостҳо дар аксари пойгоҳи додаҳо ба шумо лозим меояд, ки ҳисобро гузаронед, на шохиси сабти охирин. Тарҳи startIndex аз endIndex метавонад як амалиёти оддии арифметикӣ бошад, аммо дар ин ҷо зиёдатист.

Ҳоло мо бояд камбудиҳои татбиқи пейджингро тавассути "офсет + миқдор" тавсиф кунем:

  • Ҷустуҷӯи ҳар як саҳифаи минбаъда нисбат ба саҳифаи қаблӣ гаронтар ва сусттар хоҳад буд, зеро базаи маълумот бояд ҳама сабтҳоро аз рӯи критерияҳои ҷустуҷӯ ва ҷудокунӣ "аз аввал" гузарад ва сипас дар порчаи дилхоҳ таваққуф кунад.
  • На ҳама DBMS метавонанд ин равишро дастгирӣ кунанд.

Вариантҳо вуҷуд доранд, аммо онҳо низ нокомил мебошанд. Аввалин равишҳо "пейджинги маҷмӯи клавиатура" ё "методи ҷустуҷӯ" номида мешаванд ва чунин аст: пас аз гирифтани қисм, шумо метавонед арзишҳои майдонро дар сабти охирини саҳифа дар хотир доред ва сипас онҳоро барои ба даст овардани қисми оянда. Масалан, мо дархости зеринро иҷро кардем:

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

Ва дар сабти охирин мо арзиши санаи фармоишро гирифтем '2014-06-29'. Пас барои гирифтани саҳифаи навбатӣ шумо метавонед ин корро кунед:

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

Мушкилот дар он аст, ки OrderDate майдони беназир аст ва шарти дар боло нишондодашуда эҳтимоли бисёр сатрҳои заруриро аз даст медиҳад. Барои илова кардани номуайянӣ ба ин дархост, шумо бояд майдони беназирро ба шарт илова кунед (фарз кунед, ки 75074 арзиши охирини калиди ибтидоӣ аз қисми аввал аст):

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

Ин хосият дуруст кор мекунад, аммо дар маҷмӯъ оптимизатсия кардан душвор хоҳад буд, зеро шарт оператори OR-ро дар бар мегирад. Агар арзиши калиди асосӣ бо зиёд шудани OrderDate зиёд шавад, пас шартро бо гузоштани танҳо филтр аз SalesOrderID содда кардан мумкин аст. Аммо агар байни арзишҳои калиди ибтидоӣ ва майдоне, ки натиҷа ба он мураттаб карда мешавад, таносуби қатъӣ вуҷуд надошта бошад, дар аксари DBMS аз ин Ё худдорӣ кардан мумкин нест. Истисное, ки ман медонам, PostgreSQL мебошад, ки муқоисаи наворҳоро комилан дастгирӣ мекунад ва шарти дар боло зикршударо метавон ҳамчун "КУҶО (OrderDate, SalesOrderID) < ('2014-06-29', 75074)" навишт. Бо назардошти калиди таркибӣ бо ин ду майдон, дархости монанди ин бояд хеле осон бошад.

Як равиши алтернативии дуюмро метавон пайдо кард, масалан, дар API паймоиш ElasticSearch ё Cosmos DB — вақте ки дархост, ба ғайр аз маълумот, идентификатори махсусро бармегардонад, ки бо он шумо метавонед қисми навбатии маълумотро гиред. Агар ин идентификатор мӯҳлати бемаҳдуд дошта бошад (чунон ки дар Comsos DB), он гоҳ ин як роҳи олиҷаноб барои амалӣ кардани пейджинг бо гузариши пайдарпай байни саҳифаҳо аст (варианти №2 дар боло зикршуда). Камбудиҳои эҳтимолии он: он дар ҳама DBMS дастгирӣ намешавад; идентификатори порчаи навбатии натиҷавӣ метавонад мӯҳлати маҳдуд дошта бошад, ки одатан барои амалисозии ҳамкории корбар мувофиқ нест (ба монанди API паймоиши ElasticSearch).

Филтри мураккаб

Биёед вазифаро боз хам мураккабтар кунем. Фарз мекунем, ки барои татбиқи ҷустуҷӯи ба истилоҳ паҳлӯӣ, ки барои ҳама аз мағозаҳои онлайн хеле шинос аст, вуҷуд дорад. Намунаҳои дар асоси ҷадвали фармоишҳо овардашуда дар ин ҳолат чандон тасвирӣ надоранд, аз ин рӯ биёед аз пойгоҳи додаҳои AdventureWorks ба ҷадвали Маҳсулот гузарем:

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш
Идеяи паси ҷустуҷӯи паҳлӯӣ чист? Гап дар он аст, ки барои ҳар як унсури филтр шумораи сабтҳое, ки ба ин меъёр мувофиқанд, нишон дода шудаанд бо назардошти филтрҳои интихобшуда дар ҳамаи категорияҳои дигар.

Масалан, агар мо категорияи Дучархаҳо ва ранги Сиёҳро дар ин мисол интихоб кунем, ҷадвал танҳо велосипедҳои сиёҳро нишон медиҳад, аммо:

  • Барои ҳар як меъёр дар гурӯҳи Категорияҳо, шумораи маҳсулоти ин категория бо ранги сиёҳ нишон дода мешавад.
  • Барои ҳар як меъёри гурӯҳи "Рангҳо" шумораи велосипедҳои ин ранг нишон дода мешавад.

Дар ин ҷо як мисоли натиҷаи натиҷа барои чунин шароит аст:

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш
Агар шумо инчунин категорияи «Либос»-ро тафтиш кунед, дар ҷадвал инчунин либосҳои сиёҳи дар захира мавҷудбуда нишон дода мешаванд. Миқдори маҳсулоти сиёҳ дар бахши "Ранг" низ мувофиқи шароити нав аз нав ҳисоб карда мешавад, танҳо дар бахши "Категорияҳо" ҳеҷ чиз тағир намеёбад... Умедворам, ки ин мисолҳо барои фаҳмидани алгоритми маъмулии ҷустуҷӯии паҳлӯӣ кофӣанд.

Акнун биёед тасаввур кунем, ки ин корро дар асоси муносибатҳо чӣ гуна амалӣ кардан мумкин аст. Ҳар як гурӯҳи меъёрҳо, ба монанди Категория ва Ранг, дархости алоҳидаро талаб мекунад:

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

Натиҷаи натиҷаҳои ҷустуҷӯ ва мушкилоти иҷроиш
Дар ин ҳалли мушкилот чӣ гуна аст? Ин хеле содда аст - он хуб миқёс надорад. Ҳар як бахши филтр барои ҳисоб кардани миқдор дархости алоҳидаро талаб мекунад ва ин дархостҳо осонтарин нестанд. Дар мағозаҳои онлайн, баъзе категорияҳо метавонанд якчанд даҳҳо қисмҳои филтр дошта бошанд, ки ин метавонад мушкилоти ҷиддии иҷроиш бошад.

Одатан пас аз ин изҳорот ба ман баъзе роҳҳои ҳалли худро пешниҳод мекунанд, аз ҷумла:

  • Ҳама ҳисобҳои миқдорро дар як дархост муттаҳид кунед. Аз ҷиҳати техникӣ ин бо истифода аз калимаи калидии UNION имконпазир аст, аммо он ба иҷрои он чандон кумак намекунад - базаи маълумот бояд ҳар як порчаро аз сифр иҷро кунад.
  • Миқдори кэш. Ин ба ман тақрибан ҳар боре, ки ман мушкилотро тавсиф мекунам, пешниҳод карда мешавад. Огоҳӣ ин аст, ки ин умуман ғайриимкон аст. Фарз мекунем, ки мо 10 "ҷиҳат" дорем, ки ҳар яки онҳо 5 арзиш доранд. Ин дар муқоиса бо он чизе, ки дар ҳамон мағозаҳои онлайн дидан мумкин аст, хеле "хоксорона" аст. Интихоби як унсури ҷиҳат ба миқдори 9-и дигар таъсир мерасонад, ба ибораи дигар, барои ҳар як комбинатсияи меъёрҳо миқдорҳо метавонанд гуногун бошанд. Дар мисоли мо, ҳамагӣ 50 меъёр мавҷуд аст, ки корбар метавонад онҳоро интихоб кунад, бинобар ин, 250 комбинатсияи имконпазир вуҷуд дорад. Барои пур кардани чунин массиви маълумот хотира ё вақти кофӣ нест. Дар ин ҷо шумо метавонед эътироз кунед ва бигӯед, ки на ҳама комбинатсияҳо воқеӣ ҳастанд ва корбар хеле кам беш аз 5-10 меъёрро интихоб мекунад. Бале, боркунии танбалӣ ва кэш кардани миқдори танҳо он чизе, ки қаблан интихоб шудааст, имконпазир аст, аммо ҳар қадаре, ки интихобҳо зиёд бошанд, чунин кэш ҳамон қадар самараноктар мешавад ва мушкилоти вақти вокуниш ба назар намоёнтар мешавад (хусусан агар маҷмӯи маълумот мунтазам тағйир меёбад).

Хушбахтона, чунин мушкилот муддати тӯлонӣ ҳалли хеле муассир дорад, ки дар ҳаҷми калони маълумот пешгӯишаванда кор мекунанд. Барои ҳар яке аз ин вариантҳо, тақсим кардани ҳисобкунии дубораи ҷабҳаҳо ва қабули саҳифаи натиҷаҳоро ба ду занги мувозӣ ба сервер ва ташкили интерфейси корбар тавре ташкил кардан лозим аст, ки боркунии маълумот аз рӯи паҳлӯҳо ба намоиши натиҷаҳои ҷустуҷӯ.

  • Ҳисобкунии пурраи "ҷиҳатҳо" -ро то ҳадди имкон кам даъват кунед. Масалан, ҳар дафъае, ки меъёрҳои ҷустуҷӯ тағйир меёбад, ҳама чизро аз нав ҳисоб накунед, балки ба ҷои он шумораи умумии натиҷаҳоеро, ки ба шароити ҷорӣ мувофиқанд, пайдо кунед ва аз корбар хоҳиш кунед, ки онҳоро нишон диҳад - "1425 сабт ёфт шуд, нишон диҳед?" Истифодабаранда метавонад ё тағир додани шартҳои ҷустуҷӯро идома диҳад ё тугмаи "нишон" -ро пахш кунад. Танҳо дар ҳолати дуюм ҳамаи дархостҳо барои ба даст овардани натиҷаҳо ва аз нав ҳисоб кардани миқдорҳо аз рӯи ҳама «ҷиҳатҳо» иҷро карда мешаванд. Дар ин ҳолат, тавре ки шумо ба осонӣ мебинед, шумо бояд бо дархост барои ба даст овардани шумораи умумии натиҷаҳо ва оптимизатсияи он муроҷиат кунед. Ин усулро дар бисёр мағозаҳои хурди онлайн пайдо кардан мумкин аст. Аён аст, ки ин як даво барои ин мушкилот нест, аммо дар ҳолатҳои оддӣ он метавонад як созиши хуб бошад.
  • Барои дарёфти натиҷаҳо ва ҳисоб кардани паҳлӯҳо, аз қабили Solr, ElasticSearch, Sphinx ва дигарон аз муҳаррикҳои ҷустуҷӯ истифода баред. Ҳамаи онҳо барои сохтани "ҷиҳатҳо" тарҳрезӣ шудаанд ва ин корро аз ҳисоби индекси инвертсионалӣ хеле самаранок иҷро мекунанд. Муҳаррикҳои ҷустуҷӯ чӣ гуна кор мекунанд, чаро дар чунин мавридҳо онҳо нисбат ба пойгоҳи додаҳои умумӣ самараноктаранд, кадом амалияҳо ва домҳо вуҷуд доранд - ин мавзӯъ барои мақолаи алоҳида аст. Дар ин ҷо мехоҳам таваҷҷӯҳи шуморо ба он ҷалб намоям, ки системаи ҷустуҷӯӣ ивазкунандаи нигаҳдории маълумоти асосӣ шуда наметавонад, он ҳамчун илова истифода мешавад: ҳама гуна тағйирот дар базаи асосӣ, ки барои ҷустуҷӯ мувофиқанд, ба индекси ҷустуҷӯ ҳамоҳанг карда мешаванд; Муҳаррики ҷустуҷӯ одатан танҳо бо системаи ҷустуҷӯӣ ҳамкорӣ мекунад ва ба пойгоҳи додаҳои асосӣ дастрасӣ надорад. Яке аз нуктаҳои муҳимтарин дар ин ҷо ин аст, ки чӣ гуна ин ҳамоҳангсозиро боэътимод ташкил кардан мумкин аст. Ҳамааш ба талаботи "вақти реаксия" вобаста аст. Агар ваќти байни таѓйир додани базаи базаи асосї ва «зоњир»-и он дар љустуљў љињатнок набошад, шумо метавонед хадамотеро созед, ки њар чанд даќиќа сабтњои ба наздикї таѓйирёфтаро љустуљў мекунад ва онњоро индексатсия мекунад. Агар шумо хоҳед, ки кӯтоҳтарин вақти вокуниш ба даст оред, шумо метавонед чизе монанди амал кунед паёмдони транзаксионӣ барои фиристодани навсозиҳо ба хидмати ҷустуҷӯ.

натиҷаҳои

  1. Татбиқи пейджинги паҳлӯи сервер як мушкилии назаррас аст ва танҳо барои маҷмӯаҳои маълумотҳои зуд афзоишёбанда ё танҳо калон маъно дорад. Ягон рецепти дақиқи баҳодиҳии «калон» ё «зуд афзоишёбанда» вуҷуд надорад, аммо ман ин равишро риоя мекунам:
    • Агар гирифтани маҷмӯаи пурраи маълумот бо назардошти вақти сервер ва интиқоли шабака, ба талаботи муқаррарӣ мувофиқат кунад, татбиқи пейджинг дар тарафи сервер ҳеҷ маъно надорад.
    • Мумкин аст вазъияте вуҷуд дошта бошад, ки дар ояндаи наздик ягон мушкилии иҷроиш интизор нашавад, зеро маълумот кам аст, аммо ҷамъоварии маълумот пайваста афзоиш меёбад. Агар баъзе маҷмӯаи маълумот дар оянда метавонад нуқтаи пешинаро қонеъ нагардонад, беҳтар аст, ки фавран пейджингро оғоз кунед.
  2. Агар аз ҷониби тиҷорат талаби қатъӣ барои намоиш додани шумораи умумии натиҷаҳо ё нишон додани рақамҳои саҳифа вуҷуд надошта бошад ва системаи шумо системаи ҷустуҷӯӣ надошта бошад, беҳтар аст, ки ин нуктаҳоро амалӣ накунед ва варианти №2-ро баррасӣ кунед.
  3. Агар талаботи возеҳ барои ҷустуҷӯи паҳлӯӣ вуҷуд дошта бошад, шумо ду интихоб доред, бе талафи иҷроиш:
    • Ҳар дафъае, ки меъёрҳои ҷустуҷӯ тағир меёбанд, ҳамаи миқдорҳоро аз нав ҳисоб накунед.
    • Аз системаҳои ҷустуҷӯӣ, аз қабили Solr, ElasticSearch, Sphinx ва дигарон истифода баред. Аммо бояд фаҳмид, ки он наметавонад ивазкунандаи пойгоҳи додаҳои асосӣ бошад ва бояд ҳамчун илова ба нигаҳдории асосӣ барои ҳалли мушкилоти ҷустуҷӯ истифода шавад.
  4. Инчунин, дар ҳолати ҷустуҷӯи паҳлӯӣ, ҷустуҷӯи саҳифаи натиҷаҳои ҷустуҷӯ ва ҳисобро ба ду дархости мувозӣ тақсим кардан маъно дорад. Ҳисоб кардани миқдор метавонад нисбат ба ба даст овардани натиҷаҳо тӯл кашад, дар ҳоле ки натиҷаҳо барои корбар муҳимтаранд.
  5. Агар шумо махзани SQL-ро барои ҷустуҷӯ истифода баред, ҳама гуна тағирёбии коди марбут ба ин қисм бояд барои иҷрои миқдори мувофиқи додаҳо (зиёда аз ҳаҷм дар пойгоҳи додаҳои зинда) хуб санҷида шавад. Инчунин тавсия дода мешавад, ки мониторинги вақти иҷрои дархостҳо дар ҳама нусхаҳои пойгоҳи додаҳо ва махсусан дар "зинда" истифода шавад. Ҳатто агар бо нақшаҳои дархост дар марҳилаи таҳия ҳама чиз хуб бошад ҳам, бо афзоиши ҳаҷми маълумот, вазъ метавонад ба таври назаррас тағйир ёбад.

Манбаъ: will.com

Илова Эзоҳ