Рӯзе, ки ба шумо лозим набуд, ки дар бораи оптимизатсияи кори пойгоҳи додаҳо хавотир нашавед. Вақт дар як ҷо намеистад. Ҳар як соҳибкори нави технологӣ мехоҳад, ки Facebook-и навбатии худро эҷод кунад, дар ҳоле ки кӯшиш мекунад, ки тамоми маълумотеро, ки онҳо метавонанд ба даст оранд, ҷамъоварӣ кунанд. Соҳибкорон ба ин маълумот ниёз доранд, то моделҳои беҳтареро омӯзонанд, ки ба онҳо пул кор кунанд. Дар чунин шароит, барномасозон бояд API-ҳоро эҷод кунанд, ки ба онҳо имкон медиҳанд, ки бо миқдори зиёди иттилоот зуд ва боэътимод кор кунанд.
Агар шумо муддати дароз тарҳрезии пуштибонии барнома ё пойгоҳи додаҳо дошта бошед, эҳтимол шумо барои иҷро кардани дархостҳои саҳифабандишуда код навиштаед. Масалан, ба ин монанд:
SELECT * FROM table_name LIMIT 10 OFFSET 40
Чӣ тавр аст?
Аммо агар шумо саҳифабандии худро ҳамин тавр карда бошед, афсӯс мехӯрам, ки шумо онро ба таври муассиртарин анҷом надодаед.
Оё мехоҳед ба ман эътироз кунед?
Ақаллан як таҳиягари пуштибониро, ки ҳеҷ гоҳ истифода накардааст, номбар кунед OFFSET
и LIMIT
барои иҷрои дархостҳои саҳифабандишуда. Дар MVP (Minimum Viable Product) ва дар лоиҳаҳое, ки миқдори ками маълумот истифода мешаванд, ин равиш комилан қобили татбиқ аст. Ин «танҳо кор мекунад», ба ибораи дигар.
Аммо агар ба шумо лозим аст, ки системаҳои боэътимод ва муассирро аз сифр эҷод кунед, шумо бояд пешакӣ дар бораи самаранокии пурсиши пойгоҳи додаҳои дар чунин системаҳо истифодашаванда ғамхорӣ кунед.
Имрӯз мо дар бораи мушкилоти татбиқи маъмулан (хеле бад) истифодашавандаи муҳаррикҳои пурсишҳои саҳифавӣ ва чӣ гуна ба даст овардани нишондиҳандаҳои баланд ҳангоми иҷрои чунин дархостҳо сӯҳбат хоҳем кард.
Дар OFFSET ва LIMIT чӣ бадӣ дорад?
Тавре ки аллакай гуфта шуд, OFFSET
и LIMIT
Онҳо дар лоиҳаҳое, ки ба кор бо миқдори зиёди маълумот ниёз надоранд, хуб кор мекунанд.
Мушкилот вақте ба миён меояд, ки пойгоҳи додаҳо ба андозае калон мешаванд, ки он дигар ба хотираи сервер мувофиқат намекунад. Аммо, ҳангоми кор бо ин базаи маълумот, шумо бояд дархостҳои саҳифабандишударо истифода баред.
Барои зуҳури ин мушкилот, бояд вазъияте вуҷуд дошта бошад, ки дар он DBMS ба амалиёти бесамари Сканкунии Ҷадвали пурра дар ҳар як дархости саҳифашуда муроҷиат мекунад (дар ҳоле ки амалиёти воридкунӣ ва несткунӣ метавонад рух диҳад ва мо ба маълумоти кӯҳна ниёз надорем!).
«Сканкунии пурраи ҷадвал» (ё «скани ҷадвали пайдарпай», Скани пайдарпай) чист? Ин амалиётест, ки дар рафти он МБМ ҳар як сатри ҷадвал, яъне маълумоти дар он мавҷудбударо пай дар пай мехонад ва мувофиқати онҳоро ба шарти додашуда месанҷад. Ин намуди сканкунии ҷадвал сусттарин аст. Гап дар сари он аст, ки хангоми ичрои он амалиёти зиёди дохилкуни/барори ичро карда мешавад, ки зерсистемаи диски серверро дар бар мегиранд. Вазъият аз сабаби таъхири кор бо маълумоти дар дискҳо нигоҳ дошташуда ва аз диск ба хотира интиқол додани маълумот як амалиёти серталаби захираҳо мебошад, бадтар мешавад.
Масалан, шумо сабтҳои 100000000 корбар доред ва шумо бо сохтор дархост иҷро мекунед OFFSET 50000000
. Ин маънои онро дорад, ки DBMS бояд ҳамаи ин сабтҳоро бор кунад (ва мо ҳатто ба онҳо ниёз надорем!), онҳоро ба хотира гузорад ва пас аз он, масалан, 20 натиҷаеро, ки дар он гузориш дода мешавад, мегирад. LIMIT
.
Фарз мекунем, ки он метавонад чунин бошад: "сатрҳоро аз 50000 то 50020 аз 100000 интихоб кунед". Яъне, барои анҷом додани дархост, система аввал бояд 50000 сатрро бор кунад. Оё шумо мебинед, ки вай чӣ қадар кори нолозимро иҷро мекунад?
Агар шумо ба ман бовар накунед, ба мисоле, ки ман бо истифода аз хусусиятҳо офаридаам, нигаред
Намуна дар db-fiddle.com
Дар он ҷо, дар тарафи чап, дар саҳро Schema SQL
, код мавҷуд аст, ки ба пойгоҳи додаҳо 100000 сатр ворид мекунад ва дар тарафи рост, дар майдон Query SQL
, ду дархост нишон дода мешавад. Аввалин, оҳиста, чунин менамояд:
SELECT *
FROM `docs`
LIMIT 10 OFFSET 85000;
Ва дувум, ки роҳи ҳалли муассири ҳамон мушкилот аст, чунин аст:
SELECT *
FROM `docs`
WHERE id > 85000
LIMIT 10;
Барои иҷрои ин дархостҳо, танҳо тугмаро пахш кунед Run
дар болои саҳифа. Ин корро анҷом дода, мо маълумотро дар бораи вақти иҷрои дархост муқоиса мекунем. Маълум мешавад, ки иҷрои дархости бесамар назар ба иҷрои дархости дуюм ҳадди аққал 30 маротиба зиёдтар вақт мегирад (ин вақт аз иҷро ба иҷро фарқ мекунад; масалан, система метавонад гузориш диҳад, ки дархости аввал барои анҷом 37 мс тӯл кашид, аммо иҷрои дархости дуюм - 1 мс).
Ва агар маълумоти бештар вуҷуд дошта бошад, пас ҳама чиз боз ҳам бадтар хоҳад буд (барои боварӣ ҳосил кардан ба ин, ба ман нигоҳ кунед.
Он чизе, ки мо ҳоло муҳокима кардем, бояд ба шумо каме фаҳмиш диҳад, ки чӣ гуна дархостҳои пойгоҳи додаҳо воқеан коркард мешаванд.
Лутфан қайд кунед, ки арзиши он баландтар аст OFFSET
— барои пур кардани дархост хар кадар зиёдтар вакт мегирад.
Ба ҷои омезиши OFFSET ва LIMIT чиро бояд истифода барам?
Ба ҷои комбинатсияи OFFSET
и LIMIT
Истифодаи сохторе, ки мувофиқи нақшаи зерин сохта шудааст, бамаврид аст:
SELECT * FROM table_name WHERE id > 10 LIMIT 20
Ин иҷрои дархост бо саҳифабандии курсор асос ёфтааст.
Ба чои он ки дар махалхо захирахои хозиразамон OFFSET
и LIMIT
ва онҳоро бо ҳар як дархост интиқол диҳед, шумо бояд калиди охирини гирифташударо нигоҳ доред (одатан ин ID
) ва LIMIT
, дар натиҷа, дархостҳои шабеҳи дар боло овардашуда ба даст оварда мешаванд.
Чаро? Гап дар он аст, ки ба таври возеҳ муайян кардани идентификатори сатри охирини хондашуда, шумо ба DBMS-и худ мегӯед, ки он бояд ҷустуҷӯи маълумоти заруриро дар куҷо оғоз кунад. Ғайр аз он, ҷустуҷӯ, ба туфайли истифодаи калид, самаранок анҷом дода мешавад, система набояд аз хатҳои берун аз доираи муқарраршуда парешон шавад.
Биёед ба муқоисаи иҷрои зерини дархостҳои гуногун назар андозем. Дар ин ҷо як пурсиш бесамар аст.
Дархости суст
Ва дар ин ҷо версияи оптимизатсияшудаи ин дархост аст.
Дархости зуд
Ҳарду дархостҳо маҳз ҳамон миқдори маълумотро бармегардонанд. Аммо барои ба охир расидани якум 12,80 сония ва дуюмаш 0,01 сония лозим аст. Оё шумо фарқиятро ҳис мекунед?
Мушкилоти имконпазир
Барои самаранок кор кардани усули дархости пешниҳодшуда, ҷадвал бояд сутун (ё сутунҳо) дошта бошад, ки дорои индексҳои беназир ва пайдарпай, ба монанди идентификатори бутун бошад. Дар баъзе ҳолатҳои мушаххас, ин метавонад муваффақияти истифодаи чунин дархостҳоро барои баланд бардоштани суръати кор бо пойгоҳи додаҳо муайян кунад.
Табиист, ки ҳангоми сохтани дархостҳо шумо бояд меъмории мушаххаси ҷадвалҳоро ба назар гиред ва он механизмҳоро интихоб кунед, ки дар ҷадвалҳои мавҷуда беҳтар кор мекунанд. Масалан, агар ба шумо лозим ояд, ки дар дархостҳо бо миқдори зиёди маълумоти алоқаманд кор кунед, шумо метавонед онро ҷолиб пайдо кунед
Агар мо бо мушкилоти аз даст додани калиди ибтидоӣ рӯ ба рӯ шавем, масалан, агар мо ҷадвале дошта бошем, ки муносибати бисёр ба бисёр дошта бошем, пас равиши анъанавии истифодаи OFFSET
и LIMIT
, кафолат дода мешавад, ки ба мо мувофиқат кунад. Аммо истифодаи он метавонад ба дархостҳои эҳтимолан суст оварда расонад. Дар чунин ҳолатҳо, ман тавсия медиҳам, ки калиди ибтидоии худкор афзоишёбандаро истифода барам, ҳатто агар он танҳо барои коркарди дархостҳои саҳифабандишуда лозим бошад.
Агар шумо ба ин мавзӯъ таваҷҷӯҳ дошта бошед -
Натиҷаҳо
Хулосаи асосие, ки мо метавонем ба даст орем, ин аст, ки новобаста аз он ки мо дар бораи кадом андозаи пойгоҳи додаҳо сухан меронем, ҳамеша суръати иҷрои дархостҳоро таҳлил кардан лозим аст. Дар айни замон, миқёспазирии қарорҳо хеле муҳим аст ва агар ҳама чиз аз ибтидои кор дар системаи муайян дуруст тарҳрезӣ шуда бошад, ин дар оянда метавонад таҳиякунандаро аз мушкилоти зиёд наҷот диҳад.
Шумо чӣ гуна дархостҳои пойгоҳи додаҳоро таҳлил ва оптимизатсия мекунед?
Манбаъ: will.com