Истифодаи OFFSET ва LIMIT дар дархостҳои саҳифабандишуда худдорӣ намоед

Рӯзе, ки ба шумо лозим набуд, ки дар бораи оптимизатсияи кори пойгоҳи додаҳо хавотир нашавед. Вақт дар як ҷо намеистад. Ҳар як соҳибкори нави технологӣ мехоҳад, ки Facebook-и навбатии худро эҷод кунад, дар ҳоле ки кӯшиш мекунад, ки тамоми маълумотеро, ки онҳо метавонанд ба даст оранд, ҷамъоварӣ кунанд. Соҳибкорон ба ин маълумот ниёз доранд, то моделҳои беҳтареро омӯзонанд, ки ба онҳо пул кор кунанд. Дар чунин шароит, барномасозон бояд API-ҳоро эҷод кунанд, ки ба онҳо имкон медиҳанд, ки бо миқдори зиёди иттилоот зуд ва боэътимод кор кунанд.

Истифодаи OFFSET ва LIMIT дар дархостҳои саҳифабандишуда худдорӣ намоед

Агар шумо муддати дароз тарҳрезии пуштибонии барнома ё пойгоҳи додаҳо дошта бошед, эҳтимол шумо барои иҷро кардани дархостҳои саҳифабандишуда код навиштаед. Масалан, ба ин монанд:

SELECT * FROM table_name LIMIT 10 OFFSET 40

Чӣ тавр аст?

Аммо агар шумо саҳифабандии худро ҳамин тавр карда бошед, афсӯс мехӯрам, ки шумо онро ба таври муассиртарин анҷом надодаед.

Оё мехоҳед ба ман эътироз кунед? Шумо метавонед не сарф кардан время. суст, Shopify и mixmax Онҳо аллакай техникаеро истифода мебаранд, ки ман имрӯз дар бораи он сӯҳбат кардан мехоҳам.

Ақаллан як таҳиягари пуштибониро, ки ҳеҷ гоҳ истифода накардааст, номбар кунед OFFSET и LIMIT барои иҷрои дархостҳои саҳифабандишуда. Дар MVP (Minimum Viable Product) ва дар лоиҳаҳое, ки миқдори ками маълумот истифода мешаванд, ин равиш комилан қобили татбиқ аст. Ин «танҳо кор мекунад», ба ибораи дигар.

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

Имрӯз мо дар бораи мушкилоти татбиқи маъмулан (хеле бад) истифодашавандаи муҳаррикҳои пурсишҳои саҳифавӣ ва чӣ гуна ба даст овардани нишондиҳандаҳои баланд ҳангоми иҷрои чунин дархостҳо сӯҳбат хоҳем кард.

Дар OFFSET ва LIMIT чӣ бадӣ дорад?

Тавре ки аллакай гуфта шуд, OFFSET и LIMIT Онҳо дар лоиҳаҳое, ки ба кор бо миқдори зиёди маълумот ниёз надоранд, хуб кор мекунанд.

Мушкилот вақте ба миён меояд, ки пойгоҳи додаҳо ба андозае калон мешаванд, ки он дигар ба хотираи сервер мувофиқат намекунад. Аммо, ҳангоми кор бо ин базаи маълумот, шумо бояд дархостҳои саҳифабандишударо истифода баред.

Барои зуҳури ин мушкилот, бояд вазъияте вуҷуд дошта бошад, ки дар он DBMS ба амалиёти бесамари Сканкунии Ҷадвали пурра дар ҳар як дархости саҳифашуда муроҷиат мекунад (дар ҳоле ки амалиёти воридкунӣ ва несткунӣ метавонад рух диҳад ва мо ба маълумоти кӯҳна ниёз надорем!).

«Сканкунии пурраи ҷадвал» (ё «скани ҷадвали пайдарпай», Скани пайдарпай) чист? Ин амалиётест, ки дар рафти он МБМ ҳар як сатри ҷадвал, яъне маълумоти дар он мавҷудбударо пай дар пай мехонад ва мувофиқати онҳоро ба шарти додашуда месанҷад. Ин намуди сканкунии ҷадвал сусттарин аст. Гап дар сари он аст, ки хангоми ичрои он амалиёти зиёди дохилкуни/барори ичро карда мешавад, ки зерсистемаи диски серверро дар бар мегиранд. Вазъият аз сабаби таъхири кор бо маълумоти дар дискҳо нигоҳ дошташуда ва аз диск ба хотира интиқол додани маълумот як амалиёти серталаби захираҳо мебошад, бадтар мешавад.

Масалан, шумо сабтҳои 100000000 корбар доред ва шумо бо сохтор дархост иҷро мекунед OFFSET 50000000. Ин маънои онро дорад, ки DBMS бояд ҳамаи ин сабтҳоро бор кунад (ва мо ҳатто ба онҳо ниёз надорем!), онҳоро ба хотира гузорад ва пас аз он, масалан, 20 натиҷаеро, ки дар он гузориш дода мешавад, мегирад. LIMIT.

Фарз мекунем, ки он метавонад чунин бошад: "сатрҳоро аз 50000 то 50020 аз 100000 интихоб кунед". Яъне, барои анҷом додани дархост, система аввал бояд 50000 сатрро бор кунад. Оё шумо мебинед, ки вай чӣ қадар кори нолозимро иҷро мекунад?

Агар шумо ба ман бовар накунед, ба мисоле, ки ман бо истифода аз хусусиятҳо офаридаам, нигаред db-fiddle.com

Истифодаи OFFSET ва LIMIT дар дархостҳои саҳифабандишуда худдорӣ намоед
Намуна дар 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 мс).

Ва агар маълумоти бештар вуҷуд дошта бошад, пас ҳама чиз боз ҳам бадтар хоҳад буд (барои боварӣ ҳосил кардан ба ин, ба ман нигоҳ кунед. намуна бо 10 миллион сатр).

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

Лутфан қайд кунед, ки арзиши он баландтар аст OFFSET — барои пур кардани дархост хар кадар зиёдтар вакт мегирад.

Ба ҷои омезиши OFFSET ва LIMIT чиро бояд истифода барам?

Ба ҷои комбинатсияи OFFSET и LIMIT Истифодаи сохторе, ки мувофиқи нақшаи зерин сохта шудааст, бамаврид аст:

SELECT * FROM table_name WHERE id > 10 LIMIT 20

Ин иҷрои дархост бо саҳифабандии курсор асос ёфтааст.

Ба чои он ки дар махалхо захирахои хозиразамон OFFSET и LIMIT ва онҳоро бо ҳар як дархост интиқол диҳед, шумо бояд калиди охирини гирифташударо нигоҳ доред (одатан ин ID) ва LIMIT, дар натиҷа, дархостҳои шабеҳи дар боло овардашуда ба даст оварда мешаванд.

Чаро? Гап дар он аст, ки ба таври возеҳ муайян кардани идентификатори сатри охирини хондашуда, шумо ба DBMS-и худ мегӯед, ки он бояд ҷустуҷӯи маълумоти заруриро дар куҷо оғоз кунад. Ғайр аз он, ҷустуҷӯ, ба туфайли истифодаи калид, самаранок анҷом дода мешавад, система набояд аз хатҳои берун аз доираи муқарраршуда парешон шавад.

Биёед ба муқоисаи иҷрои зерини дархостҳои гуногун назар андозем. Дар ин ҷо як пурсиш бесамар аст.

Истифодаи OFFSET ва LIMIT дар дархостҳои саҳифабандишуда худдорӣ намоед
Дархости суст

Ва дар ин ҷо версияи оптимизатсияшудаи ин дархост аст.

Истифодаи OFFSET ва LIMIT дар дархостҳои саҳифабандишуда худдорӣ намоед
Дархости зуд

Ҳарду дархостҳо маҳз ҳамон миқдори маълумотро бармегардонанд. Аммо барои ба охир расидани якум 12,80 сония ва дуюмаш 0,01 сония лозим аст. Оё шумо фарқиятро ҳис мекунед?

Мушкилоти имконпазир

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

Табиист, ки ҳангоми сохтани дархостҳо шумо бояд меъмории мушаххаси ҷадвалҳоро ба назар гиред ва он механизмҳоро интихоб кунед, ки дар ҷадвалҳои мавҷуда беҳтар кор мекунанд. Масалан, агар ба шумо лозим ояд, ки дар дархостҳо бо миқдори зиёди маълумоти алоқаманд кор кунед, шумо метавонед онро ҷолиб пайдо кунед ин мақола.

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

Агар шумо ба ин мавзӯъ таваҷҷӯҳ дошта бошед - инак, инак и инак - якчанд маводи муфид.

Натиҷаҳо

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

Шумо чӣ гуна дархостҳои пойгоҳи додаҳоро таҳлил ва оптимизатсия мекунед?

Истифодаи OFFSET ва LIMIT дар дархостҳои саҳифабандишуда худдорӣ намоед

Манбаъ: will.com

Илова Эзоҳ