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

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅! Аз съм Π±Π΅ΠΊΠ΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, пиша микросСрвизи Π½Π° 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. Бтабилността сС ΡΡŠΡΡ‚ΠΎΠΈ Π² Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π΅ сС ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ Π½Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° Π·Π°ΠΏΡ€Π°ΡˆΠ²Π°Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° (ΠΏΡ€ΠΈΠΌ.: Π°ΠΊΠΎ искатС Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ към пагинацията, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Ρ‚Π΅ прСзСнтацията Π½Π° Π°Π²Ρ‚ΠΎΡ€Π°. Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ сравнитСлни Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ).

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

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

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

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

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

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

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

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

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

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

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

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

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

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