ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ»ΡŽΡ‡Π°Ρ…

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! Π― бэкэнд-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΏΠΈΡˆΡƒ микросСрвисы Π½Π° Java + Spring. Π Π°Π±ΠΎΡ‚Π°ΡŽ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π’ΠΈΠ½ΡŒΠΊΠΎΡ„Ρ„.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ»ΡŽΡ‡Π°Ρ…

Π£ нас Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ часто встаСт вопрос ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ запросов Π² Π‘Π£Π‘Π”. ВсСгда хочСтся Π΅Ρ‰Π΅ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ быстрСС, Π½ΠΎ Π½Π΅ всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎ выстроСнными индСксами β€” приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ. Π’ΠΎ врСмя ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… скитаний ΠΏΠΎ сСти Π² поисках Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Ρ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π‘Π” я нашСл бСсконСчно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ Π±Π»ΠΎΠ³ ΠœΠ°Ρ€ΠΊΡƒΡΠ° Π’ΠΈΠ½Π°Π½Π΄Π°, Π°Π²Ρ‚ΠΎΡ€Π° ΠΊΠ½ΠΈΠ³ΠΈ SQL Performance Explained. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‚ самый Ρ€Π΅Π΄ΠΊΠΈΠΉ Π²ΠΈΠ΄ Π±Π»ΠΎΠ³ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС ΡΡ‚Π°Ρ‚ΡŒΠΈ подряд.

Π₯ΠΎΡ‡Ρƒ пСрСвСсти для вас Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠœΠ°Ρ€ΠΊΡƒΡΠ°. Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ стСпСни манифСстом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стрСмится ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊ старой, Π½ΠΎ Π΄ΠΎ сих ΠΏΠΎΡ€ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ offset ΠΏΠΎ стандарту SQL.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСстах я Π±ΡƒΠ΄Ρƒ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€Π° пояснСниями ΠΈ замСчаниями. ВсС Ρ‚Π°ΠΊΠΈΠ΅ мСста я Π±ΡƒΠ΄Ρƒ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Β«ΠΏΡ€ΠΈΠΌ.Β» для большСй ясности

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

Π”ΡƒΠΌΠ°ΡŽ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π½Π°ΡŽΡ‚, насколько ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ ΠΈ Ρ‚ΠΎΡ€ΠΌΠΎΠ·Π½ΠΎΠΉ оказываСтся Ρ€Π°Π±ΠΎΡ‚Π° с постраничными сСлСктами Ρ‡Π΅Ρ€Π΅Π· offset. А Π·Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ довольно просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ?

Π˜Ρ‚Π°ΠΊ, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово offset ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ n записСй Π² запросС. Однако Π±Π°Π·Π° всС Π΅Ρ‰Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ эти ΠΏΠ΅Ρ€Π²Ρ‹Π΅ n записСй с диска, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ порядкС (ΠΏΡ€ΠΈΠΌ.: ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ сортировку, Ссли ΠΎΠ½Π° Π·Π°Π΄Π°Π½Π°), ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ записи начиная с n+1 ΠΈ Π΄Π°Π»Π΅Π΅. Π‘Π°ΠΌΠΎΠ΅ интСрСсноС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π‘Π£Π‘Π”, Π½ΠΎ Π² ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎ стандарту:

…the rows are first sorted according to the <order by clause> and then limited by dropping the number of rows specified in the <result offset clause> from the beginning…
-SQL:2016, Part 2, 4.15.3 Derived tables (ΠΏΡ€ΠΈΠΌ.: cСйчас самый ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ стандарт)

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΏΡƒΠ½ΠΊΡ‚ здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ 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 Π³ΠΎΠ΄Π°. Если интСрСсно, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² пСрвоисточник.)

Как Ρ€Π°Π· Π½Π° этом ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅ ΠΈ Π½ΡƒΠΆΠ½Π° ваша ΠΏΠΎΠΌΠΎΡ‰ΡŒ. Если Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΡŒ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡŽ, Ρ‚ΠΎ я ΠΏΡ€ΠΎΡˆΡƒ, я ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°ΡŽ, я молю вас ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ»ΡŽΡ‡Π°Ρ…. Если Π΅ΡΡ‚ΡŒ вопросы ΠΈΠ»ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ, Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄Ρƒ ΠΏΠΎΠΌΠΎΡ‡ΡŒ (Ρ„ΠΎΡ€ΡƒΠΌ, Twitter, Ρ„ΠΎΡ€ΠΌΠ° для ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ) (ΠΏΡ€ΠΈΠΌ.: ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ общСния с ΠœΠ°Ρ€ΠΊΡƒΡΠΎΠΌ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ относится с энтузиазмом ΠΊ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΡŽ этой Ρ‚Π΅ΠΌΡ‹).

Если ΠΆΠ΅ Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, достойны ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ, β€” создайтС рСквСст ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ссылкС Π΄Π°Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ.

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

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΎΠΉ простой ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠ°ΠΊ пагинация ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ, ΠΌΠ°Π»ΠΎ распространСн, Π½Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это слоТно Π² тСхничСской Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… усилий. Главная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с offset β€” Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ диктуСтся самим стандартом.

Как слСдствиС, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎ смСнС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π° ΠΈΠ·-Π·Π° этого ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° со стороны Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ развиваСтся слабо. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Π°ΠΌ Π±Π»ΠΈΠ·ΠΊΠ° идСя ΠΈ Ρ†Π΅Π»ΡŒ бСзофсСтной ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ, β€” ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π΅!

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

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