Π—Π°Ρ‰ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° инструмСнтална ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° пагинацията ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички! Аз съм Π±Π΅ΠΊΠ΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, пиша микросСрвиси Π½Π° Java + Spring. Работя Π² Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π΅ΠΊΠΈΠΏΠΈΡ‚Π΅ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ Π² компанията Π’ΠΈΠ½ΡŒΠΊΠΎΡ„Ρ„.

Π—Π°Ρ‰ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° инструмСнтална ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° пагинацията ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅

Π’ нашия Π΅ΠΊΠΈΠΏ чСсто сС поставя Π²ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π·Π° оптимизация Π½Π° заявкитС Π² Π‘Π£Π‘Π”. Π’ΠΈΠ½Π°Π³ΠΈ искамС Π΄Π° бъдСм ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΈ, Π½ΠΎ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°ΠΌΠ΅ само Π½Π° Π΄ΠΎΠ±Ρ€Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ΠΈ индСкси β€” понякога трябва Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΠΌ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½ΠΈΡ Π² ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π·Π° Ρ€Π°Π·ΡƒΠΌΠ½ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Π‘Π”, ΠΎΡ‚ΠΊΡ€ΠΈΡ… Π±Π΅Π·ΠΊΡ€Π°ΠΉΠ½ΠΎ полСзния Π±Π»ΠΎΠ³ Π½Π° ΠœΠ°Ρ€ΠΊΡƒΡ Π’ΠΈΠ½Π°Π½Π΄, Π°Π²Ρ‚ΠΎΡ€ Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° SQL Performance Explained. Π’ΠΎΠ²Π° Π΅ ΠΎΠ½Π·ΠΈ Ρ€ΡΠ΄ΡŠΠΊ Ρ‚ΠΈΠΏ Π±Π»ΠΎΠ³, Π² ΠΊΠΎΠΉΡ‚ΠΎ моТСш Π΄Π° Ρ‡Π΅Ρ‚Π΅Ρˆ всички статии Π΅Π΄Π½Π° слСд Π΄Ρ€ΡƒΠ³Π°.

Искам Π΄Π° ΠΏΡ€Π΅Π²Π΅Π΄Π° Π·Π° вас Π΅Π΄Π½Π° ΠΌΠ°Π»ΠΊΠ° статия Π½Π° ΠœΠ°Ρ€ΠΊΡƒΡ. МоТС Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π΅ Π² извСстСн смисъл манифСст, ΠΊΠΎΠΉΡ‚ΠΎ Ρ†Π΅Π»ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ към стар, Π½ΠΎ всС ΠΎΡ‰Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π° производитСлността Π½Π° опСрацията offset спорСд SQL стандарта.

На някои мСста Ρ‰Π΅ добавя пояснСния ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠΈ ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π°. Всички Ρ‚Π΅Π·ΠΈ мСста Ρ‰Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°ΠΌ ΠΊΠ°Ρ‚ΠΎ β€žΠΏΡ€ΠΈΠΌ.β€œ Π·Π° ΠΏΠΎ-голяма яснота.

НСбольшоС ввСдСниС

Мисля, Ρ‡Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€Π° знаят ΠΊΠΎΠ»ΠΊΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Π° ΠΈ Π±Π°Π²Π½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с постранични сСлСкти Ρ‡Ρ€Π΅Π· offset. Но Π·Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС доста лСсно Π·Π°ΠΌΠ΅Π½Π΅Π½Π° с ΠΏΠΎ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π½Π° конструкция?

И Ρ‚Π°ΠΊΠ°, ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΎΡ‚ΠΎ слово offset ΡƒΠΊΠ°Π·Π²Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π° пропуснС ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ n записа Π² заявката. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° Π±Π°Π·Π°Ρ‚Π° всС ΠΎΡ‰Π΅ трябва Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ Ρ‚Π΅Π·ΠΈ ΠΏΡŠΡ€Π²ΠΈ n записа ΠΎΡ‚ диска, Π² зададСния Ρ€Π΅Π΄ (ΠΏΡ€ΠΈΠΌ.: Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ сортиранС, Π°ΠΊΠΎ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ), ΠΈ само слСд Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡŠΡ€Π½Π΅ записитС, Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΉΠΊΠΈ ΠΎΡ‚ n+1 ΠΈ Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ. Най-интСрСсното Π΅, Ρ‡Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π½Π΅ Π΅ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ‚Π° рСализация Π² Π‘Π£Π‘Π”, Π° Π² ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎΡ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ стандарта:

…the rows are first sorted according to the and then limited by dropping the number of rows specified in the from the beginning…
-SQL:2016, Part 2, 4.15.3 Derived tables (ΠΏΡ€ΠΈΠΌ.: Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π°ΠΉ-използваният стандарт)

ΠšΠ»ΡŽΡ‡ΠΎΠ²ΠΈΡΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ‚ΡƒΠΊ Π΅, Ρ‡Π΅ offset ΠΏΡ€ΠΈΠ΅ΠΌΠ° СдинствСн ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ β€” броя Π½Π° записитС, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° сС пропуснат, ΠΈ Ρ‚ΠΎΠ²Π° Π΅ всичко. Π‘Π»Π΅Π΄Π²Π°ΠΉΠΊΠΈ Ρ‚ΠΎΠ²Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π‘Π£Π‘Π” ΠΌΠΎΠΆΠ΅ само Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ всички записи ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»ΠΈ Π½Π΅Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π΅, Ρ‡Π΅ Ρ‚Π°ΠΊΠΎΠ²Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° offset-Π° ΠΊΠ°Ρ€Π° Π΄Π° сС Π²ΡŠΡ€ΡˆΠΈ излишна Ρ€Π°Π±ΠΎΡ‚Π°. И Ρ‚ΡƒΠΊ Π΄ΠΎΡ€ΠΈ Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π°Π»ΠΈ Π΅ SQL ΠΈΠ»ΠΈ NoSQL.

ΠžΡ‰Π΅ ΠΌΠ°Π»ΠΊΠΎ Π±ΠΎΠ»ΠΊΠ°

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ с offset Π½Π΅ сС ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ²Π°Ρ‚ Ρ‚ΡƒΠΊ, ΠΈ Π΅Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ. Ако ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° Π΄Π²Π΅ страници Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ диска бъдС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Π½Π° Π΄Ρ€ΡƒΠ³Π° опСрация, която Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈ Π½ΠΎΠ² запис, ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ сС случи Π² Ρ‚ΠΎΠ·ΠΈ случай?

Π—Π°Ρ‰ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° инструмСнтална ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° пагинацията ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅

ΠšΠΎΠ³Π°Ρ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° offset Π·Π° пропусканС Π½Π° записи ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ страници, Π² ситуация, Π² която Π½ΠΎΠ² запис бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ страници, Π½Π°ΠΉ-вСроятно Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ρ‚ΠΎΠ²Π° Π΅ възмоТно, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‡Π΅Ρ‚Π΅ΠΌ странично, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ конструкцията order by, ΠΈ Π½ΠΎΠ² запис ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π»Π΅Π·Π΅ Π² срСдата Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΎ прСдставянС).

Π˜Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡΡ‚Π° ясно ΠΏΠΎΠΊΠ°Π·Π²Π° Ρ‚Π°ΠΊΠ°Π²Π° ситуация. Π‘Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Ρ‡Π΅Ρ‚Π΅ ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ 10 записа, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ сС добавя Π½ΠΎΠ² запис, ΠΊΠΎΠΉΡ‚ΠΎ измСствя всички ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ΠΈ записи с 1. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π±Π°Π·Π°Ρ‚Π° Π²Π·ΠΈΠΌΠ° Π½ΠΎΠ²Π° страница с 10 слСдващи записа ΠΈ Π·Π°ΠΏΠΎΡ‡Π²Π° Π½Π΅ ΠΎΡ‚ 11-ия, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ трябвало, Π° ΠΎΡ‚ 10-ия, Π΄ΡƒΠ±Π»ΠΈΡ€Π°ΠΉΠΊΠΈ Ρ‚ΠΎΠ·ΠΈ запис. Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ²Π° изразяванС, Π½ΠΎ Ρ‚Π°Π·ΠΈ Π΅ Π½Π°ΠΉ-чСсто срСщаната.

ΠšΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ установихмС, Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π΅ са спСцифични Π·Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° Π‘Π£Π‘Π” ΠΈΠ»ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅ Π² дСфиницията Π½Π° пагинацията ΠΏΠΎ стандарта SQL. НиС ΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π½Π° Π‘Π£Π‘Π” коя страница трябва Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ»ΠΊΠΎ записи Π΄Π° пропуснС. Π‘Π°Π·Π°Ρ‚Π° просто Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° Ρ‚Π°ΠΊΠ°Π²Π° заявка, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ информацията Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ ΠΌΠ°Π»ΠΊΠΎ.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΅ умСстно Π΄Π° ΡƒΡ‚ΠΎΡ‡Π½ΠΈΠΌ, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° Π΄ΡƒΠΌΠ°, Π° ΠΏΠΎ-скоро сСмантика Π½Π° заявката. Има ΠΎΡ‰Π΅ няколко ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ ΠΏΠΎ проблСмност синтаксиса:

  • ΠšΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° offset, ΠΊΠ°ΠΊΡ‚ΠΎ бСшС посочСно ΠΏΠΎ-Ρ€Π°Π½ΠΎ.
  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΎΡ‚ Π΄Π²Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΈ Π΄ΡƒΠΌΠΈ limit [offset] (Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ самата limit Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° лоша).
  • Π€ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ ΠΏΠΎ Π΄ΠΎΠ»Π½ΠΈ Π³Ρ€Π°Π½ΠΈΡ†ΠΈ, основано Π½Π° номСрация Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅Ρ‚Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, row_number(), rownum ΠΈ Ρ‚.Π½.).

Всички Ρ‚Π΅Π·ΠΈ ΠΈΠ·Ρ€Π°Π·ΠΈ просто ΠΊΠ°Π·Π²Π°Ρ‚ ΠΊΠΎΠ»ΠΊΠΎ Ρ€Π΅Π΄Π° трябва Π΄Π° сС пропуснат, Π±Π΅Π· Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация ΠΈΠ»ΠΈ контСкст.

По-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ Π² Ρ‚Π°Π·ΠΈ статия ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° offset сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° всички Ρ‚Π΅Π·ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ.

Π–ΠΈΠ²ΠΎΡ‚ Π±Π΅Π· OFFSET

А сСга си прСдставСтС ΠΊΠ°ΠΊ Ρ‰Π΅ΡˆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π°ΡˆΠΈΡΡ‚ свят Π±Π΅Π· Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Оказва сС, Ρ‡Π΅ ΠΆΠΈΠ²ΠΎΡ‚ΡŠΡ‚ Π±Π΅Π· offset Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° слоТСн: с сСлСкт ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ само ΠΎΠ½Π΅Π·ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ всС ΠΎΡ‰Π΅ Π½Π΅ смС Π²ΠΈΠ΄Π΅Π»ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ρ‚.Π΅. Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Π±ΠΈΠ»ΠΈ Π½Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° страница), с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° условиС Π² where.

Π’ Ρ‚ΠΎΠ·ΠΈ случай сС основавамС Π½Π° Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ сСлСктитС сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π²ΡŠΡ€Ρ…Ρƒ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΎ мноТСство (старият Π΄ΠΎΠ±ΡŠΡ€ order by). Въй ΠΊΠ°Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΎ мноТСство, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ доста прост Ρ„ΠΈΠ»Ρ‚ΡŠΡ€, Π·Π° Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ само Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ са слСд послСдния запис ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° страница:

    SELECT ...
    FROM ...
    WHERE ...
    AND id < ?last_seen_id
    ORDER BY id DESC
    FETCH FIRST 10 ROWS ONLY

И Ρ‚ΠΎΠ²Π° Π΅ цСлият ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° Ρ‚Π°ΠΊΡŠΠ² ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΏΡ€ΠΈ сортиранС ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΈ всичко става ΠΏΠΎ-вСсСло, Π½ΠΎ идСята си остава ΡΡŠΡ‰Π°Ρ‚Π°. Π’Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ конструкция Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ NoSQL-Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ сС Π½Π°Ρ€ΠΈΡ‡Π° seek method ΠΈΠ»ΠΈ keyset pagination. Π’ΠΎΠΉ Ρ€Π΅ΡˆΠ°Π²Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с плаващия Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ (Π±Π΅Π»Π΅ΠΆΠΊΠ°: ситуацията с запис ΠΌΠ΅ΠΆΠ΄Ρƒ чСтСнията Π½Π° страницитС, описана ΠΏΠΎ-Π³ΠΎΡ€Π΅) ΠΈ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ ΠΈ стабилно ΠΎΡ‚ класичСския offset. Бтабилността сС ΡΡŠΡΡ‚ΠΎΠΈ Π² Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° заявка Π½Π΅ сС ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ Π½Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° заявСната Ρ‚Π°Π±Π»ΠΈΡ†Π° (Π±Π΅Π»Π΅ΠΆΠΊΠ°: Π°ΠΊΠΎ искатС Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ към пагинацията, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Ρ‚Π΅ прСзСнтацията Π½Π° Π°Π²Ρ‚ΠΎΡ€Π°. Π’Π°ΠΌ ΡΡŠΡ‰ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ сравнитСлни Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ).

Π•Π΄ΠΈΠ½ ΠΎΡ‚ слайдовСтС Ρ€Π°Π·ΠΊΠ°Π·Π²Π° Π·Π° Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ пагинацията ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π½Π΅ Π΅ Π²ΡΠ΅ΠΌΠΎΠ³ΡŠΡ‰Π° β€” тя ΠΈΠΌΠ° свои ограничСния. Най-Π·Π½Π°Ρ‡ΠΈΠΌΠΎΡ‚ΠΎ Π΅, Ρ‡Π΅ няма Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° сС Ρ‡Π΅Ρ‚Π°Ρ‚ случайни страници (Π±Π΅Π»Π΅ΠΆΠΊΠ°: нСпослСдоватСлно). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π² Π΅ΠΏΠΎΡ…Π°Ρ‚Π° Π½Π° Π±Π΅Π·ΠΊΡ€Π°ΠΉΠ½ΠΎΡ‚ΠΎ скролиранС (Π±Π΅Π»Π΅ΠΆΠΊΠ°: Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°) Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° голям ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π£ΠΊΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° страницата Π·Π° ΠΊΠ»ΠΈΠΊΠ²Π°Π½Π΅ β€” Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка лошо Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° UI (Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΌΠ½Π΅Π½ΠΈΠ΅ Π½Π° Π°Π²Ρ‚ΠΎΡ€Π° Π½Π° статията).

А ΠΊΠ°ΠΊΠ²ΠΎ става с инструмСнтитС?

ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡΡ‚Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ чСсто Π½Π΅ Π΅ подходяща ΠΏΠΎΡ€Π°Π΄ΠΈ липса Π½Π° инструмСнтална ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄. ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ инструмСнтитС Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΡƒΡŠΡ€ΠΊ, Π½Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ ΠΈΠ·Π±ΠΎΡ€ относно Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС изпълнява пагинацията.

Битуацията сС услоТнява ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ описаният ΠΌΠ΅Ρ‚ΠΎΠ΄ изисква пълна ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π² ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ β€” ΠΎΡ‚ Π‘Π£Π‘Π” Π΄ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° AJAX-заявки Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΏΡ€ΠΈ Π±Π΅Π·ΠΊΡ€Π°ΠΉΠ½ΠΎ скролиранС. ВмСсто Π΄Π° ΡƒΠΊΠ°Π·Π²Π°Ρ‚Π΅ само Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° страницата, сСга Ρ‰Π΅ трябва Π΄Π° посочитС Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ Π·Π° всички страници навСднъТ.

ΠžΠ±Π°Ρ‡Π΅ броят Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ²Π΅Ρ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ пагинация Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅, постСпСнно нараства. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°:

(ΠŸΡ€ΠΈΠΌ.: някои Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ бяха ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΡ€Π΅Π²ΠΎΠ΄Π° някои Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ бяха обновявани ΠΎΡ‚ 2017β€”2018 Π³ΠΎΠ΄ΠΈΠ½Π°. Ако Π²ΠΈ интСрСсува, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ с ΠΏΡŠΡ€Π²ΠΎΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ°.)

Π’ΠΎΡ‡Π½ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ Π²Π°ΡˆΠ°Ρ‚Π° ΠΏΠΎΠΌΠΎΡ‰. Ако Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° пагинация, моля, ΠΏΡ€ΠΈΠ·ΠΎΠ²Π°Π²Π°ΠΌ Π²ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ св native ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° пагинация Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅. Ако ΠΈΠΌΠ°Ρ‚Π΅ Π²ΡŠΠΏΡ€ΠΎΡΠΈ ΠΈΠ»ΠΈ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΏΠΎΠΌΠΎΡ‰, Ρ‰Π΅ сС Ρ€Π°Π΄Π²Π°ΠΌ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π° (Ρ„ΠΎΡ€ΡƒΠΌ, Twitter, Ρ„ΠΎΡ€ΠΌΠ° Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°) (ΠΏΡ€ΠΈΠΌ.: ΠΎΡ‚ личния ΠΌΠΈ ΠΎΠΏΠΈΡ‚ Π² ΠΎΠ±Ρ‰ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ с ΠœΠ°Ρ€ΠΊΡƒΡ ΠΌΠΎΠ³Π° Π΄Π° ΠΊΠ°ΠΆΠ°, Ρ‡Π΅ Ρ‚ΠΎΠΉ наистина Π΅ Снтусиазиран относно разпространСниСто Π½Π° Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ°).

Ако ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ мислитС, Ρ‡Π΅ заслуТават ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° пагинация ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅, β€” ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ рСквСст ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π°ΠΊΠΎ Π΅ възмоТно. ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° спомСнСтС Ρ‚Π°Π·ΠΈ статия Π² Π»ΠΈΠ½ΠΊΠ°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π°, ΠΏΠΎΡ€Π°Π΄ΠΈ която Ρ‚Π°ΠΊΡŠΠ² прост ΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎ пагинация ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ Π½Π΅ Π΅ ΡˆΠΈΡ€ΠΎΡ€Π°Π·ΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½, Π½Π΅ Π΅, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π΅ слоТно тСхничСски ΠΈΠ»ΠΈ изисква някакви Π³ΠΎΠ»Π΅ΠΌΠΈ усилия. ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΅, Ρ‡Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€Π° свикнали Π΄Π° Π²ΠΈΠΆΠ΄Π°Ρ‚ ΠΈ работят с offset β€” Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅ Π½Π°Π»ΠΎΠΆΠ΅Π½ ΠΎΡ‚ самия стандарт.

Π’ слСдствиС Π½Π° Ρ‚ΠΎΠ²Π°, ΠΌΠ°Π»ΠΊΠΎ сС замислят Π·Π° промяна Π½Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° към пагинацията, Π° ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° инструмСнталната ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° ΠΎΡ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ²Π΅Ρ‚Π΅ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ сС Ρ€Π°Π·Π²ΠΈΠ²Π° слабо. Π—Π°Ρ‚ΠΎΠ²Π°, Π°ΠΊΠΎ Π²ΠΈ Π΅ Π±Π»ΠΈΠ·ΠΊΠ° идСята ΠΈ Ρ†Π΅Π»Ρ‚Π° Π½Π° бСзофсСтната пагинация, β€” ΠΏΠΎΠΌΠΎΠ³Π½Π΅Ρ‚Π΅ Π΄Π° я разпространим!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: https://use-the-index-luke.com/no-offset
Автор: Markus Winand

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster