Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

Один ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… сцСнариСв Π²ΠΎ всСх ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Ρ… Π½Π°ΠΌ прилоТСниях β€” поиск Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ критСриям ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΡ… Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ для чтСния Π²ΠΈΠ΄Π΅. Π’ΡƒΡ‚ ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΏΠΎ сортировкС, Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ΅, постраничному Π²Ρ‹Π²ΠΎΠ΄Ρƒ. Π—Π°Π΄Π°Ρ‡Π°, ΠΏΠΎ ΠΈΠ΄Π΅Π΅, Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ, Π½ΠΎ ΠΏΡ€ΠΈ Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ ряд ошибок, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΌ страдаСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ этой Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π²Ρ‹Π±ΠΎΡ€Ρƒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π° #1

Π‘Π°ΠΌΡ‹ΠΉ простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ β€” это постраничный Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска Π² Π΅Π³ΠΎ самом классичСском Π² Π²ΠΈΠ΄Π΅.

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ
ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСляционная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π’ этом случаС для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π²Π° SQL запроса:

  • ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строки для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ страницы.
  • ΠŸΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ количСство строк, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ критСриям поиска β€” это Π½ΡƒΠΆΠ½ΠΎ для ΠΏΠΎΠΊΠ°Π·Π° страниц.

Рассмотрим ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запрос Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ тСстовой MS SQL Π±Π°Π·Ρ‹ AdventureWorks для 2016 сСрвСра. Для этой Ρ†Π΅Π»ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Sales.SalesOrderHeader:

SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ запрос Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 50 Π·Π°ΠΊΠ°Π·ΠΎΠ² ΠΈΠ· списка, отсортированного ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ Π΄Π°Ρ‚Ρ‹ добавлСния, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами β€” 50 послСдних Π·Π°ΠΊΠ°Π·ΠΎΠ².

ВыполняСтся ΠΎΠ½ быстро Π½Π° тСстовой Π±Π°Π·Π΅, Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΠ»Π°Π½ выполнСния ΠΈ статистику Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

Table 'SalesOrderHeader'. Scan count 1, logical reads 698, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ статистику Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π² срСдС выполнСния запросов ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ SET STATISTICS IO ON.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠ»Π°Π½Π° выполнСния, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ рСсурсоСмкой являСтся сортировка всСх строк исходной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ Π΄Π°Ρ‚Π΅ добавлСния. И ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ большС Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ строк, Ρ‚Π΅ΠΌ «тяТСлСС» Π±ΡƒΠ΄Π΅Ρ‚ сортировка. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‚Π°ΠΊΠΈΡ… ситуаций слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ, поэтому Π΄ΠΎΠ±Π°Π²ΠΈΠΌ индСкс Π½Π° Π΄Π°Ρ‚Ρƒ добавлСния ΠΈ посмотрим, измСнилось Π»ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ рСсурсов:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

Table 'SalesOrderHeader'. Scan count 1, logical reads 165, physical reads 0, read-ahead reads 5, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, стало Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅. Но всС Π»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½Ρ‹? ИзмСним запрос Π½Π° поиск Π·Π°ΠΊΠ°Π·ΠΎΠ², Π³Π΄Π΅ суммарная ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 100 Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ²:

SELECT * FROM Sales.SalesOrderHeader
WHERE SubTotal > 100
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

Table 'SalesOrderHeader'. Scan count 1, logical reads 1081, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

ИмССм Π·Π°Π±Π°Π²Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ: ΠΏΠ»Π°Π½ запроса Π½Π΅Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, Π½ΠΎ фактичСскоС количСство логичСских Ρ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΏΠΎΡ‡Ρ‚ΠΈ Π² Π΄Π²Π° Ρ€Π°Π·Π° большС, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌ сканС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’Ρ‹Ρ…ΠΎΠ΄ Π΅ΡΡ‚ΡŒ β€” Ссли ΠΈΠ· ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ индСкса ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ составной ΠΈ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΡƒΠΌΠΌΠ°Ρ€Π½ΡƒΡŽ Ρ†Π΅Π½Ρƒ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ², Ρ‚ΠΎ снова ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 165 logical reads:

CREATE INDEX IX_SalesOrderHeader_OrderDate_SubTotal on Sales.SalesOrderHeader(OrderDate, SubTotal);

Π­Ρ‚Ρƒ ΡΠ΅Ρ€ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π΄ΠΎΠ»Π³ΠΎ, Π½ΠΎ Π΄Π²Π΅ основных мысли, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Ρ…ΠΎΡ‡Ρƒ здСсь Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ, Ρ‚Π°ΠΊΠΈΠ΅:

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ любого Π½ΠΎΠ²ΠΎΠ³ΠΎ критСрия ΠΈΠ»ΠΈ порядка сортировки Π² поисковый запрос ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ выполнСния.
  • Но Ссли Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, подходящиС ΠΏΠΎΠ΄ условия поиска β€” Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ способов ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ запрос.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ запросу, упомянутому Π² самом Π½Π°Ρ‡Π°Π»Π΅ β€” ΠΊ Ρ‚ΠΎΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ считаСт количСство записСй, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΡ… поисковому ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡŽ. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” поиск Π·Π°ΠΊΠ°Π·ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΡ€ΠΎΠΆΠ΅ 100 Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ²:

SELECT COUNT(1) FROM Sales.SalesOrderHeader
WHERE SubTotal > 100

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ составного индСкса, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

Table 'SalesOrderHeader'. Scan count 1, logical reads 698, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Π’ΠΎ, Ρ‡Ρ‚ΠΎ запрос ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ вСсь индСкс Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ β€” Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅ SubTotal стоит Π½Π΅ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, поэтому запрос Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ индСкса Π½Π° ΠΏΠΎΠ»Π΅ SubTotal, ΠΈ ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Ρƒ Π΄Π°Π΅Ρ‚ ΡƒΠΆΠ΅ всСго 48 logical reads.

МоТно привСсти Π΅Ρ‰Π΅ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² запросов Π½Π° подсчСт количСства, Π½ΠΎ ΡΡƒΡ‚ΡŒ останСтся Ρ‚ΠΎΠΉ ΠΆΠ΅: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ подсчСт ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства β€” это Π΄Π²Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… запроса, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ своих ΠΌΠ΅Ρ€ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ получится Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ индСксов, которая ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для ΠΎΠ±ΠΎΠΈΡ… запросов.

БоотвСтствСнно, ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ поискового Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ β€” Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ бизнСсу Π²Π°ΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ количСство Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚. А навигация ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ страницы, Π½Π° ΠΌΠΎΠΉ взгляд β€” Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ·ΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ примСнСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ сцСнариСв с ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³ΠΎΠΌ выглядит ΠΊΠ°ΠΊ Β«ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ страницу».

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π° #2

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡƒΡŽ страницу:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ
По Ρ„Π°ΠΊΡ‚Ρƒ измСнилось Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ возмоТности ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ страниц, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ для отобраТСния Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, сколько всСго ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ. Но Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос β€” Π° ΠΊΠ°ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΡƒΠ·Π½Π°Π΅Ρ‚, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ страницы (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ссылку Β«NextΒ»)?

ΠžΡ‚Π²Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ простой: ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· Π±Π°Π·Ρ‹ Π½Π° ΠΎΠ΄Π½Ρƒ запись большС, Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ для отобраТСния, ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ этой Β«Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉΒ» записи ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ порция. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для получСния ΠΎΠ΄Π½ΠΎΠΉ страницы Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ запрос, Ρ‡Ρ‚ΠΎ сущСствСнно ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π£ мСня Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π±Ρ‹Π» случай, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ подсчСта ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства записСй ускорил Π²Ρ‹Π΄Π°Ρ‡Ρƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² 4-5 Ρ€Π°Π·.

Для этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° сущСствуСт нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса: ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Β«Π½Π°Π·Π°Π΄Β» ΠΈ Β«Π²ΠΏΠ΅Ρ€Π΅Π΄Β», ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅, ΠΊΠ½ΠΎΠΏΠΊΠ° Β«Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅Β», которая просто добавляСт Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΡ€Ρ†ΠΈΡŽ Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, «бСсконСчная ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ°Β», которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Β«Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅Β», Π½ΠΎ сигналом для получСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡ€Ρ†ΠΈΠΈ являСтся ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ всСх Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Каким Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π»ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… остаСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅.

ΠΡŽΠ°Π½ΡΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π°

Π’ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… запросов, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ «смСщСниС + количСство», ΠΊΠΎΠ³Π΄Π° Π² самом запросС указываСтся с ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎ порядку строки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈ ΠΊΠ°ΠΊΠΎΠ΅ количСство строк Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ. Π‘ΠΏΠ΅Ρ€Π²Π° рассмотрим, ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² этом случаС. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ я встрСчал нСсколько способов:

  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ страницы (pageIndex), Ρ€Π°Π·ΠΌΠ΅Ρ€ страницы (pageSize).
  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠΉ записи, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ (startIndex), максимальноС количСство записСй Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ (count).
  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠΉ записи, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ (startIndex), порядковый Π½ΠΎΠΌΠ΅Ρ€ послСднСй записи, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ (endIndex).

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнтарно, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅Ρ‚. Но это Π½Π΅ Ρ‚Π°ΠΊ β€” Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ являСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ (startIndex, count). На это Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½:

  • Для ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° с Π²Ρ‹Ρ‡ΠΈΡ‚ΠΊΠΎΠΉ +1 записи, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с pageIndex ΠΈ pageSize ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π΅Π½. НапримСр, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ 50 записСй Π½Π° страницС. Богласно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, Π½ΡƒΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ запись большС, Ρ‡Π΅ΠΌ Π½Π°Π΄ΠΎ. Если этот Β«+1Β» Π½Π΅ Π·Π°Π»ΠΎΠΆΠ΅Π½ Π½Π° сСрвСрС, получаСтся, Ρ‡Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π²ΠΎΠΉ страницы ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ записи с 1 ΠΏΠΎ 51, для Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” с 51 ΠΏΠΎ 101 ΠΈ Ρ‚.Π΄. Если ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ страницы 51 ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ pageIndex, Ρ‚ΠΎ вторая страница Π²Π΅Ρ€Π½Π΅Ρ‚ с 52 ΠΏΠΎ 102 ΠΈ Ρ‚.Π΄. БоотвСтствСнно, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ СдинствСнный способ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ страницу β€” Π·Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° сСрвСрС Π²Ρ‹Ρ‡ΠΈΡ‚ΠΊΡƒ «лишнСй» строки, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ нСявным нюансом.
  • Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для выполнСния запросов Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… всС Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ количСство, Π° Π½Π΅ индСкс послСднСй записи. ΠŸΡƒΡΡ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ startIndex ΠΈΠ· endIndex ΠΈ элСмСнтарная арифмСтичСская опСрация, Π½ΠΎ ΠΎΠ½Π° здСсь лишняя.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ слСдуСт ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ нСдостатки Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π° Ρ‡Π΅Ρ€Π΅Π· «смСщСниС + количСство»:

  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ страницы Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Π΅Π΅ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… всС Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ всС записи «с Π½Π°Ρ‡Π°Π»Π°Β» согласно критСриям поиска ΠΈ сортировки, послС Ρ‡Π΅Π³ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅.
  • НС всС Π‘Π£Π‘Π” ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² называСтся Β«keyset pagingΒ» ΠΈΠ»ΠΈ Β«seek methodΒ» ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: послС получСния ΠΏΠΎΡ€Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ значСния ΠΏΠΎΠ»Π΅ΠΉ Π² послСднСй записи Π½Π° страницС, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для получСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡ€Ρ†ΠΈΠΈ. НапримСр, ΠΌΡ‹ выполняли Ρ‚Π°ΠΊΠΎΠΉ запрос:

SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

И Π² послСднСй записи ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‹ Π·Π°ΠΊΠ°Π·Π° ‘2014-06-29’. Π’ΠΎΠ³Π΄Π° для получСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ страницы ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅:

SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate < '2014-06-29'
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ OrderDate β€” Π½Π΅ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΈ условиС, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅, с большой Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ пропустит ΠΌΠ½ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½Ρ‹Ρ… строк. Для внСсСния однозначности Π² этот запрос, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ 75074 β€” послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΡ€Ρ†ΠΈΠΈ):

SELECT * FROM Sales.SalesOrderHeader
WHERE (OrderDate = '2014-06-29' AND SalesOrderID < 75074)
   OR (OrderDate < '2014-06-29')
ORDER BY OrderDate DESC, SalesOrderID DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Π½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ тяТСло ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ условиС содСрТит ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ OR. Если с ростом OrderDate растСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, Ρ‚ΠΎ условиС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ, оставив Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ SalesOrderID. Но Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈ поля, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ отсортирован Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π½Π΅Ρ‚ строгой коррСляции β€” Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π‘Π£Π‘Π” ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого OR Π½Π΅ получится. Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹ΠΌ ΠΌΠ½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся PostgreSQL, Π³Π΄Π΅ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ поддСрТиваСтся сравнСниС ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ условиС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Β«WHERE (OrderDate, SalesOrderID) < (‘2014-06-29’, 75074)Β». ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ составного ΠΊΠ»ΡŽΡ‡Π° с этими двумя полями ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ запрос Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточно Π»Π΅Π³ΠΊΠΈΠΌ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ElasticSearch scroll API ΠΈΠ»ΠΈ Cosmos DB β€” ΠΊΠΎΠ³Π΄Π° запрос ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΡ€Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…. Если этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ срок ΠΆΠΈΠ·Π½ΠΈ (ΠΊΠ°ΠΊ Π² Comsos DB), Ρ‚ΠΎ это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π° с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ страницами (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ #2 упомянутый Π²Ρ‹ΡˆΠ΅). Π•Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ нСдостатки: поддСрТиваСтся Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΠΎ всСх Π‘Π£Π‘Π”; ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡ€Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ срок ΠΆΠΈΠ·Π½ΠΈ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ElasticSearch scroll API).

БлоТная Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ

УслоТняСм Π·Π°Π΄Π°Ρ‡Ρƒ дальшС. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, появилось Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ faceted search, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ всСм Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ ΠΏΠΎ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°ΠΌ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° основС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΊΠ°Π·ΠΎΠ² Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ Π² этом случаС, поэтому ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Product ΠΈΠ· Π±Π°Π·Ρ‹ AdventureWorks:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ
Π’ Ρ‡Π΅ΠΌ идСя faceted search? Π’ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° показываСтся количСство записСй, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… этому ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡŽ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ², Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… Π²ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… катСгориях.

НапримСр, Ссли ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Bikes ΠΈ Ρ†Π²Π΅Ρ‚ Black, Ρ‚Π°Π±Π»ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вСлосипСды Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Π½ΠΎ ΠΏΡ€ΠΈ этом:

  • Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ критСрия Π³Ρ€ΡƒΠΏΠΏΡ‹ Β«CategoriesΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ число ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΈΠ· этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°.
  • Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ критСрия Π³Ρ€ΡƒΠΏΠΏΡ‹ Β«ColorsΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ число вСлосипСдов этого Ρ†Π²Π΅Ρ‚Π°.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° для Ρ‚Π°ΠΊΠΈΡ… условий:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ
Если Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Β«ClothingΒ», Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ ΠΈ ΠΎΠ΄Π΅ΠΆΠ΄Ρƒ Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, которая Π΅ΡΡ‚ΡŒ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° Π² сСкции Β«ColorΒ» Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ пСрСсчитано согласно Π½ΠΎΠ²Ρ‹ΠΌ условиям, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² сСкции Β«CategoriesΒ» Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСнится… НадСюсь этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ faceted search.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° рСляционной Π±Π°Π·Π΅. КаТдая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π², такая ΠΊΠ°ΠΊ Category ΠΈ Color, Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ запроса:

SELECT pc.ProductCategoryID, pc.Name, COUNT(1) FROM Production.Product p
  INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
  INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
WHERE p.Color = 'Black'
GROUP BY pc.ProductCategoryID, pc.Name
ORDER BY COUNT(1) DESC

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ

SELECT Color, COUNT(1) FROM Production.Product p
  INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.ProductCategoryID = 1 --Bikes
GROUP BY Color
ORDER BY COUNT(1) DESC

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ
Π§Ρ‚ΠΎ ΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ с этим Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ? ΠžΡ‡Π΅Π½ΡŒ просто β€” ΠΎΠ½ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ. КаТдая сСкция Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ запроса для подсчСта количСств ΠΈ запросы эти Π½Π΅ самыС Π»Π΅Π³ΠΊΠΈΠ΅. Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°Ρ… Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€ΡƒΠ±Ρ€ΠΈΠΊΠ°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ нСсколько дСсятков сСкций Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ послС этих ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΌΠ½Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

  • ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС подсчСты количСства Π² ΠΎΠ΄ΠΈΠ½ запрос. ВСхничСски это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова UNION, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это Π½Π΅ сильно ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ β€” Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… всС Ρ€Π°Π²Π½ΠΎ придСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ «с нуля» ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².
  • ΠšΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСства. Π­Ρ‚ΠΎ ΠΌΠ½Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ практичСски ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° я ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Нюанс Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас 10 «фасСтов», Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… 5 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ «скромная» ситуация Π½Π° Ρ„ΠΎΠ½Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°Ρ…. Π’Ρ‹Π±ΠΎΡ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта фасСта влияСт Π½Π° количСства Π² 9-Ρ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² количСства ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ. ВсСго Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 50 ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, соотвСтствСнно Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ 250. На Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ массива Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π½ΠΈ памяти, Π½ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ€Π΅Π΄ΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ большС 5-10 ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π². Π”Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ количСства Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ, Π½ΠΎ Ρ‡Π΅ΠΌ большС Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π²Ρ‹Π±ΠΎΡ€Π°, Ρ‚Π΅ΠΌ ΠΌΠ΅Π½Π΅Π΅ эффСктивным Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ кСш ΠΈ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° (особСнно Ссли Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… рСгулярно измСняСтся).

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, подобная Π·Π°Π΄Π°Ρ‡Π° ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ достаточно эффСктивныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, прСдсказуСмо Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Для любого ΠΈΠ· этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ пСрСсчСт фасСтов ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ страницы Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π½Π° Π΄Π²Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… обращСния ΠΊ сСрвСру ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ фасСтам Β«Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚Β» ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска.

  • Π’Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ пСрСсчСт «фасСтов» ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΠΆΠ΅. НапримСр, Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² поиска, Π° вмСсто этого Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ количСство Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ условиям, ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈΡ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ β€” Β«1425 записСй Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ?Β» ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ условия поиска, Π»ΠΈΠ±ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΒ». Волько Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ всС запросы ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈ пСрСсчСту количСств Π½Π° всСх «фасСтах». ΠŸΡ€ΠΈ этом, ΠΊΠ°ΠΊ нСслоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, придСтся ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с запросом Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΎΡ‚ способ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°Ρ…. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это Π½Π΅ панацСя для Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ Π² простых случаях ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠΌ компромиссом.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ search engine для поиска Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈ подсчСта фасСтов, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Solr, ElasticSearch, Sphinx ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ВсС ΠΎΠ½ΠΈ рассчитаны Π½Π° построСниС «фасСтов» ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ это достаточно эффСктивно Π·Π° счСт ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ индСкса. Как устроСны поисковыС систСмы, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Π² Ρ‚Π°ΠΊΠΈΡ… случаях эффСктивнСС Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния, ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ β€” это Ρ‚Π΅ΠΌΠ° для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ search engine Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ основного Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ½ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: Π»ΡŽΠ±Ρ‹Π΅ измСнСния Π² основной Π±Π°Π·Π΅, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для поиска, ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² поисковый индСкс; ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ поиска взаимодСйствуСт ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с search engine ΠΈ Π½Π΅ обращаСтся ΠΊ основной Π±Π°Π·Π΅. Один ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² здСсь β€” ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. ВсС зависит ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Β«Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈΒ». Если врСмя ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π² основной Π±Π°Π·Π΅ ΠΈ Π΅Π³ΠΎ «проявлСниСм» Π² поискС Π½Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π· Π² нСсколько ΠΌΠΈΠ½ΡƒΡ‚ ΠΈΡ‰Π΅Ρ‚ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ записи ΠΈ ΠΈΡ… индСксируСт. Если трСбуСтся минимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ врСмя Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° transactional outbox для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π² поисковый сСрвис.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

  1. РСализация ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π° Π½Π° сторонС сСрвСра β€” ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ услоТнСниС, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для быстрорастущих ΠΈΠ»ΠΈ просто Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Как ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ «большой» ΠΈΠ»ΠΈ «быстрорастущий» β€” Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π° Π½Π΅Ρ‚, Π½ΠΎ я Π±Ρ‹ придСрТивался Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:
    • Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ сСрвСрного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ сСти Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ укладываСтся Π² трСбования ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³ Π½Π° сторонС сСрвСра смысла Π½Π΅Ρ‚.
    • ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ такая ситуация, Ρ‡Ρ‚ΠΎ Π½Π° блиТайшСС врСмя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ прСдвидится, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ°Π»ΠΎ, Π½ΠΎ коллСкция Π΄Π°Π½Π½Ρ‹Ρ… постоянно растСт. Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π² пСрспСктивС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡƒΠ½ΠΊΡ‚Ρƒ β€” Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³ Π·Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ сразу.
  2. Если со стороны бизнСса Π½Π΅Ρ‚ ТСсткого трСбования ΠΏΠΎ ΠΏΠΎΠΊΠ°Π·Ρƒ ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² страниц, ΠΈ ΠΏΡ€ΠΈ этом Π² вашСй систСмС Π½Π΅Ρ‚ поискового Π΄Π²ΠΈΠΆΠΊΠ° β€” Π»ΡƒΡ‡ΡˆΠ΅ эти ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ #2.
  3. Если Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎ faceted search, Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π½Π΅ ΠΏΠΎΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ:
    • НС ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС количСства Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² поиска.
    • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ search engine Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Solr, ElasticSearch, Sphinx ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Но слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ основной Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ основному Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Ρƒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поисковых Π·Π°Π΄Π°Ρ‡.
  4. Π’Π°ΠΊΠΆΠ΅ Π² случаС faceted search ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ страницы Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ подсчСт количСств Π½Π° Π΄Π²Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… запроса. ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ количСств ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ большСС врСмя, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Π°ΠΆΠ½Π΅Π΅ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  5. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ SQL Π±Π°Π·Ρƒ для поиска, любоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, относящССся ΠΊ этой части, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ объСмС Π΄Π°Π½Π½Ρ‹Ρ… (прСвосходящСм объСм Π² Β«ΠΆΠΈΠ²ΠΎΠΉΒ» Π±Π°Π·Π΅). Π–Π΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния запросов Π½Π° всСх экзСмплярах Π±Π°Π·Ρ‹, ΠΈ особСнно β€” Π½Π° Β«ΠΆΠΈΠ²ΠΎΠΌΒ». Π”Π°ΠΆΠ΅ Ссли Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΏΠ»Π°Π½Π°ΠΌΠΈ запросов всС Π±Ρ‹Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, с ростом объСма Π΄Π°Π½Π½Ρ‹Ρ… ситуация ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ.

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