atomic-extra-batch-pagination.md 1.7 KB

Лишние batch-запросы при пагинации

Контекст: В PlaceService.List GetTagsBatch и GetFeaturesBatch вызывались на полном списке мест, включая лишний элемент limit+1 (нужен только для определения hasMore).

Суть

Репозиторий возвращает limit+1 записей для cursor-based пагинации. Лишняя запись нужна только для флага hasMore и сразу отбрасывается.

Проблема: batch-запросы тегов и фич выполнялись ДО обрезки лишней записи — лишний SQL-запрос к таблицам place_tags и place_features.

// было:
places = fetch(limit+1)
tagsMap = GetTagsBatch(places)       // ← лишний запрос для limit+1 элемента
featuresMap = GetFeaturesBatch(places) // ← лишний запрос для limit+1 элемента
places = places[:limit]
hasMore = true

// стало:
places = fetch(limit+1)
hasMore = len(places) > limit
places = places[:limit]              // ← обрезка ДО batch-запросов
tagsMap = GetTagsBatch(places)       // ← только limit элементов
featuresMap = GetFeaturesBatch(places)

Файл: backend/internal/services/places.go:142-190

Связанные заметки

  • [[architecture-overview]] — таблица P1
  • [[atomic-n-plus-one-getbyid]] — аналогичный N+1 паттерн

Источник

Code review 2026-07-01, исправление P1.

#backend #performance #pagination #n-plus-one #sql