goon/alembic/versions
goon-foss 470beb4aa6 perf(api): sortowanie scen po studiu i tytule bez sortowania calego katalogu
Obie listy chodzily na produkcji w dziesiatkach sekund, bo klucz sortu nie mial nic
wspolnego z filtrami widocznosci (zywy playback, odsiew wertykalow, odsiew stubow).

sort=studio: nazwa studia siedzi w dolaczonej tabeli, wiec zaden indeks scen jej nie
zna i planer materializowal caly przefiltrowany katalog (ponad 2 mln wierszy), po czym
sortowal go w calosci. Odwracamy zapytanie: idziemy po studiach w kolejnosci nazwy i dla
kazdego dobieramy jego sceny przez LATERAL po ix_scenes_studio_effective_date_desc.
Zewnetrzny skan jest posortowany, wiec LIMIT urywa go po kilkunastu studiach. Sceny bez
studia dobiera osobny ogon, tak jak wczesniej robilo NULLS LAST. Przy filtrze po studiach
zawezamy tez sam skan studiow, inaczej szedlby przez wszystkie 33 tys.

sort=title: nowy indeks na cale ORDER BY (title_normalized, created_at DESC, id DESC).
Sam title_normalized zostawial Incremental Sort, a ten przed oddaniem pierwszego wiersza
musi zebrac caly kubelek scen o tym samym tytule.

Pomiary na produkcji (2026-09-16, ten sam zestaw filtrow, po rozgrzewce):

  studio strona 1            483 s  ->   41 ms
  studio strona 5            ponad 5 min ->   38 ms
  studio + tag blowjob        71 s  ->  226 ms
  studio + min_duration       48 s  ->   42 ms
  studio + studio_slugs      255 ms ->   44 ms
  tytul strona 1             709 ms ->   12 ms  (81 wpisow indeksu zamiast 3064)
  tytul + tag blowjob        ponad 90 s -> 1,5 s

Wynik jest identyczny co do wiersza: pierwsze 251 pozycji pelnego katalogu porownane
pozycja po pozycji ze starym zapytaniem daje zero roznic, tak samo dwa okna alfabetyczne
studiow (w tym Brazzers, zeby sprawdzic wewnetrzny LIMIT).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:37:26 +02:00
..
20260502_0001_initial.py Initial commit 2026-05-20 10:10:22 +02:00
20260502_0002_playback_sources.py Initial commit 2026-05-20 10:10:22 +02:00
20260503_0003_playback_dead.py Initial commit 2026-05-20 10:10:22 +02:00
20260504_0004_animated_thumbnail.py Initial commit 2026-05-20 10:10:22 +02:00
20260504_0005_favorite_performers.py Initial commit 2026-05-20 10:10:22 +02:00
20260504_0006_blacklists.py Initial commit 2026-05-20 10:10:22 +02:00
20260504_0007_play_progress.py Initial commit 2026-05-20 10:10:22 +02:00
20260506_0008_performer_search_meta.py Initial commit 2026-05-20 10:10:22 +02:00
20260506_0009_movies.py Initial commit 2026-05-20 10:10:22 +02:00
20260506_0010_favorite_scenes.py Initial commit 2026-05-20 10:10:22 +02:00
20260507_0011_origin_pornapp_to_tube.py Initial commit 2026-05-20 10:10:22 +02:00
20260508_0012_favorite_studios.py Initial commit 2026-05-20 10:10:22 +02:00
20260509_0013_bug_reports.py Initial commit 2026-05-20 10:10:22 +02:00
20260509_0014_favorite_movies.py Initial commit 2026-05-20 10:10:22 +02:00
20260510_0015_bug_reports_movie_id.py Initial commit 2026-05-20 10:10:22 +02:00
20260512_0016_realdebrid_cache.py Initial commit 2026-05-20 10:10:22 +02:00
20260512_0017_drop_realdebrid_cache.py Initial commit 2026-05-20 10:10:22 +02:00
20260528_0018_movie_play_progress.py feat(movies): watched/continue-watching tracking end-to-end 2026-05-28 23:24:06 +02:00
20260531_0019_taxonomy_scene_counts.py perf(taxonomy): denormalize scene_count for tags/performers/studios 2026-05-31 17:53:48 +02:00
20260602_0020_scene_tags_tag_id_index.py perf(scenes): drop exact count on filtered lists; index scene_tags(tag_id) 2026-06-02 12:00:36 +02:00
20260607_0021_scene_tags_tag_id_stats.py migration(0021): raise scene_tags.tag_id statistics target to 1000 2026-06-07 21:12:22 +02:00
20260608_0022_device_scoped_user_state.py feat(api): device-scope user state (favorites/progress/blacklists) 2026-06-10 08:58:01 +02:00
20260612_0023_bug_report_replies.py feat(bug-reports): two-way replies (device-scoped) + admin reply endpoint 2026-06-12 11:35:44 +02:00
20260616_0024_saved_searches.py feat(api): per-device saved searches (keyword favorites) 2026-06-16 13:52:18 +02:00
20260622_0025_source_ranking.py feat(sources): 0-5★ ranking on Sites (freshness/metadata/plays) + playback telemetry 2026-06-22 10:00:59 +02:00
20260702_0026_scene_backfill_flag.py fix(review): player recovery deadlocks, quick-play re-fire, backfill gaps, em-dashes 2026-07-02 09:20:40 +02:00
20260705_0027_playback_event_error_detail.py fix(watchporn): re-resolve stale CDN URL in-player, drop WebView page fallback 2026-07-05 01:18:08 +02:00
20260721_0028_tags_name_altkey_index.py fix(tags): collapse spelling-variant duplicate tags + prevent regrowth 2026-07-21 15:59:33 +02:00
20260727_0025_phash_blacklist.py fix(dedup): blacklista zdegenerowanych phashy + scalenie 4647 duplikatow 2026-07-27 12:47:20 +02:00
20260727_0026_scene_performer_source.py feat(dedup): provenance przypisan performerow do scen (scene_performers.source_id) 2026-07-27 15:04:10 +02:00
20260727_0027_scenes_title_trgm.py perf(scenes): indeks trigramowy na title + ranking kandydatow do przegladu 2026-07-27 15:59:52 +02:00
20260813_0028_phash_backfill_queue.py feat(dedup): backfill phasha z zapisanych miniaturek 2026-08-13 10:49:12 +02:00
20260818_0029_scenes_max_quality.py feat(filtr): minimalna jakosc w filtrze scen (720p/1080p/4K) 2026-08-18 11:06:34 +02:00
20260818_0030_scenes_quality_threshold_idx.py feat(filtr): minimalna jakosc w filtrze scen (720p/1080p/4K) 2026-08-18 11:06:34 +02:00
20260820_0031_duration_backfill_queue.py feat(ingest): backfill brakujacej dlugosci scen 2026-08-20 12:10:22 +02:00
20260820_0032_origin_release_sort_idx.py perf(scenes): indeks pod sortowanie serwisu po dacie premiery + fix wyscigu zapisu wyszukiwania 2026-08-20 16:00:58 +02:00
20260820_0033_effective_date_idx.py fix(sites): sortuj po dacie premiery z fallbackiem na date dodania + napraw miniaturki 2026-08-20 16:25:53 +02:00
20260902_0034_favorite_sites.py feat(favorites): przypinane strony (favorite_sites) z endpointami list/add/remove 2026-09-02 22:44:35 +02:00
20260914_0035_scenes_duration_idx.py feat(scenes): sortowanie losowe (seed, okno po PK) i po dlugosci (indeks partial), zgloszenie ae6a045b 2026-09-14 15:13:13 +02:00
20260914_0036_clips.py feat(clips): tabele klipow do feedu Swipe + ingest RedGifs (etap 2) 2026-09-14 16:32:57 +02:00
20260914_0037_clip_feed.py feat(clips): feed Swipe z afinicznoscia, pamiecia widzianych i telemetria (etap 3) 2026-09-14 20:29:49 +02:00
20260915_0038_scenes_studio_effective_date_idx.py perf(api): liczniki +N ulubionych z cache i indeksem, podobne sceny z najrzadszych tagow 2026-09-15 15:05:43 +02:00
20260916_0039_scenes_title_created_id_idx.py perf(api): sortowanie scen po studiu i tytule bez sortowania calego katalogu 2026-09-16 10:37:26 +02:00