Indeksowanie paneli administracyjnych: najpierw optymalizuj najczęściej używane filtry
Indeksowanie dla paneli administracyjnych: optymalizuj filtry, które użytkownicy klikają najczęściej — status, przypisany, zakresy dat i wyszukiwanie tekstowe — na podstawie rzeczywistych wzorców zapytań.

Dlaczego filtry w panelach administracyjnych stają się wolne
Panele administracyjne zwykle zaczynają działać szybko. Otwierasz listę, przewijasz, klikasz rekord i idziesz dalej. Spowolnienie pojawia się, gdy ludzie filtrują w sposób, w jaki naprawdę pracują: "Tylko otwarte zgłoszenia", "Przypisane do Mai", "Utworzone w zeszłym tygodniu", "Order ID zawiera 1047". Każde kliknięcie wywołuje czekanie i lista zaczyna się kleić.
Ta sama tabela może być szybka dla jednego filtra i boleśnie wolna dla innego. Filtr po statusie może dotyczyć małego wycinka wierszy i zwrócić szybko. Filtr „utworzone między dwiema datami" może zmusić bazę do odczytania ogromnego zakresu. Filtr po przypisanym może działać dobrze samodzielnie, a zwolnić, gdy połączysz go ze statusem i sortowaniem.
Indeksy to skrót, którego baza używa, by znaleźć pasujące wiersze bez czytania całej tabeli. Ale indeksy nie są darmowe. Zajmują miejsce i sprawiają, że inserty i aktualizacje są trochę wolniejsze. Dodanie zbyt wielu może spowodować, że zapisy będą wolniejsze i wciąż nie rozwiążą rzeczywistego wąskiego gardła.
Zamiast indeksować wszystko, priorytetyzuj filtry, które:
- są używane non-stop
- obejmują dużo wierszy
- powodują zauważalne oczekiwanie
- można poprawić bezpiecznie prostymi, dobrze dopasowanymi indeksami
To podejście jest celowo wąskie. Pierwsze skargi na wydajność list w panelach administracyjnych prawie zawsze dotyczą tych samych czterech typów filtrów: statusu, przypisanego, zakresów dat i pól tekstowych. Gdy zrozumiesz, dlaczego zachowują się inaczej, kolejne kroki są jasne: przeanalizuj rzeczywiste wzorce zapytań, dodaj najmniejszy indeks, który je obsłuży, i zweryfikuj, że poprawiłeś wolną ścieżkę bez tworzenia nowych problemów.
Wzorce zapytań stojące za rzeczywistą pracą w panelu admina
Panele admina rzadko są wolne z powodu jednego ogromnego raportu. Zwalniają, bo kilka ekranów jest używanych cały dzień, a te ekrany wykonują wiele małych zapytań w kółko.
Zespoły operacyjne zwykle żyją w kilku kolejkach pracy: tickets, orders, users, approvals, internal requests. Na tych stronach filtry się powtarzają:
- Status, bo odzwierciedla workflow (New, Open, Pending, Done)
- Assignee, bo zespoły potrzebują „moje elementy" i „nieprzypisane"
- Zakresy dat, bo ktoś zawsze pyta „co wydarzyło się w zeszłym tygodniu?"
- Wyszukiwanie, żeby skoczyć do znanego elementu (numer zamówienia, email) lub przeszukać tekst (notatki, podglądy)
Praca bazy zależy od intencji:
- "Przeglądaj najnowsze" to wzorzec skanowania. Zwykle wygląda jak "pokaż najnowsze elementy, może ograniczone statusem, posortowane po created time" i jest paginowany.
- "Znajdź konkretny element" to wzorzec wyszukiwania. Admin ma już ID, email, numer zgłoszenia lub referencję i oczekuje, że baza od razu przejdzie do małego zestawu wierszy.
Panele admina też łączą filtry w przewidywalny sposób: "Open + Unassigned", "Pending + Assigned to me", albo "Completed w ostatnich 30 dniach". Indeksy działają najlepiej, gdy pasują do tych rzeczywistych kształtów zapytań, a nie do listy kolumn.
Jeśli budujesz narzędzia admina w AppMaster, te wzorce są zwykle widoczne po obejrzeniu najczęściej używanych ekranów list i ich domyślnych filtrów. To ułatwia indeksowanie tego, co naprawdę napędza codzienną pracę, a nie tego, co dobrze wygląda na papierze.
Jak wybrać, co indeksować najpierw
Traktuj indeksowanie jak triage. Nie zaczynaj od indeksowania każdej kolumny, która pojawia się w rozwijanym filtrze. Zacznij od kilku zapytań, które uruchamiają się non-stop i najbardziej denerwują użytkowników.
Znajdź filtry, których ludzie rzeczywiście używają
Optymalizowanie filtra, którego nikt nie używa, to strata czasu. Aby znaleźć prawdziwe gorące ścieżki, połącz sygnały:
- Analiza UI: które ekrany mają najwięcej odsłon, które filtry są najczęściej klikalne
- Logi bazy lub API: najczęściej występujące zapytania i te najwolniejsze kilka procent
- Informacje zwrotne wewnętrzne: "wyszukiwanie jest wolne" zwykle wskazuje konkretny ekran
- Domyślna lista startowa: co uruchamia się zaraz po otwarciu panelu przez administratora
W wielu zespołach domyślny widok to coś w rodzaju "Open tickets" lub "New orders". Uruchamia się on za każdym razem, gdy ktoś odświeża, zmienia zakładkę lub wraca po odpowiedzi.
Grupuj zapytania według kształtu, nie nazwy pola
Zanim dodasz indeks, pogrupuj typowe zapytania według ich zachowania. Większość zapytań listowych w panelach admina mieści się w kilku kubełkach:
- Filtry równościowe:
status = 'open',assignee_id = 42 - Filtry zakresowe:
created_atmiędzy dwoma datami - Sortowanie i paginacja:
ORDER BY created_at DESCi pobierz stronę 2 - Wyszukiwanie tekstowe: dopasowanie dokładne (order number), dopasowanie prefiksu (email zaczyna się od), lub wyszukiwanie zawierające
Zapisz kształt dla każdego top ekranu, włączając WHERE, ORDER BY i paginację. Dwa zapytania, które wyglądają podobnie w UI, mogą dramatycznie różnić się w pracy bazy.
Wybierz małą pierwszą partię
Zacznij od jednego priorytetowego celu: domyślnego zapytania listy, które ładuje się najpierw. Potem wybierz 2–3 kolejne często używane zapytania. Zwykle to wystarcza, by odciąć największe opóźnienia bez zamieniania bazy w muzeum indeksów.
Przykład: zespół wsparcia otwiera listę Tickets filtrowaną do status = 'open', sortowaną po najnowszych, z opcjonalnym assignee i zakresem dat. Najpierw zoptymalizuj dokładnie tę kombinację. Gdy będzie szybka, przejdź do następnego ekranu według użycia.
Indeksowanie filtra status bez przesady
Status to jeden z pierwszych filtrów, które ludzie dodają, i jeden z najłatwiejszych do błędnego zaindeksowania.
Większość pól status ma niską kardynalność: tylko kilka wartości (open, pending, closed). Indeks pomaga najbardziej, gdy potrafi zawęzić wyniki do małego wycinka tabeli. Jeśli 80–95% wierszy ma ten sam status, indeks tylko na status często niewiele zmieni. Baza i tak będzie musiała odczytać dużą część wierszy, a indeks dodaje narzut.
Zwykle odczujesz korzyść, gdy:
- jeden status jest rzadki (np. escalated)
- status jest połączony z innym warunkiem, który znacząco zawęża wynik
- status + sortowanie odpowiada typowemu widokowi listy
Częsty wzorzec to "pokaż mi otwarte elementy, najnowsze na górze." Wtedy indeks łączący filtr i sortowanie często przebija indeks samego status.
Kombinacje, które zwykle opłacają się najpierw:
status + updated_at(filtrowanie po statusie, sortowanie po ostatnich zmianach)status + assignee_id(widoki kolejek pracy)status + updated_at + assignee_id(tylko jeśli ten konkretny widok jest intensywnie używany)
Indeksy częściowe (partial indexes) to dobry kompromis, gdy jeden status dominuje. Jeśli widok "open" jest główny, zaindeksuj tylko wiersze z open. Indeks będzie mniejszy, a koszt zapisów niższy.
-- PostgreSQL example: index only open rows, optimized for newest-first lists
CREATE INDEX CONCURRENTLY tickets_open_updated_idx
ON tickets (updated_at DESC)
WHERE status = 'open';
Praktyczny test: uruchom wolne zapytanie admina z i bez filtra statusu. Jeśli jest wolne w obu wariantach, indeks tylko na statusie go nie uratuje. Skoncentruj się na sortowaniu i drugim filtrze, który faktycznie zawęża listę.
Filtrowanie po przypisanym: indeksy równościowe i typowe kombinacje
W większości paneli admina przypisany to ID użytkownika przechowywane na rekordzie: klucz obcy jak assignee_id. To klasyczny filtr równościowy i często szybki z prostym indeksem.
Assignee pojawia się też z innymi filtrami, bo odzwierciedla sposób pracy. Lider wsparcia może filtrować "Przypisane do Aleksa" i potem zawęzić do "Open", żeby zobaczyć, co jeszcze wymaga uwagi. Jeśli ten widok jest wolny, często potrzebujesz czegoś więcej niż indeks jednopokolumnowy.
Dobry punkt startowy to indeks złożony dopasowany do typowej kombinacji:
(assignee_id, status)dla "moich otwartych elementów"(assignee_id, status, updated_at)jeśli lista jest też sortowana po ostatnich zmianach
Kolejność ma znaczenie w indeksach złożonych. Umieść filtry równościowe pierwsze (często assignee_id, potem status), a kolumnę sortującą lub zakresową na końcu (updated_at). To zgadza się z tym, jak baza potrafi efektywnie użyć indeksu.
Nieprzypisane elementy to częste źródło pułapek. Wiele systemów reprezentuje "unassigned" jako NULL w assignee_id, a menedżerowie często filtrują właśnie tak. W zależności od bazy i kształtu zapytania, NULL może zmienić plan wystarczająco, żeby indeks działający świetnie dla przypisanych wypadł blado dla nieprzypisanych.
Jeśli nieprzypisane jest ważne, wybierz jedną jasną konwencję i przetestuj:
- Pozostaw
assignee_idnullable, ale upewnij się, żeWHERE assignee_id IS NULLjest przetestowane i indeksowane, gdy trzeba. - Użyj dedykowanej wartości (np. specjalny użytkownik "Unassigned") tylko jeśli pasuje do modelu danych.
- Dodaj indeks częściowy dla wierszy nieprzypisanych, jeśli baza to wspiera.
Jeśli budujesz panel admina w AppMaster, warto logować dokładne filtry i sorty używane przez zespół, a potem odwzorować te wzorce kilkoma dobrze dobranymi indeksami zamiast indeksować każde pole, które jest dostępne.
Zakresy dat: indeksy dopasowane do sposobu filtrowania
Filtry dat zwykle pojawiają się jako szybkie presety typu "ostatnie 7 dni" lub "ostatnie 30 dni", plus niestandardowy wybór z datą początkową i końcową. Wyglądają prosto, ale na dużych tabelach powodują różne rodzaje pracy bazy.
Po pierwsze, bądź pewien, której kolumny czasowej ludzie naprawdę używają. Stosuj:
created_atdla widoków "nowe elementy"updated_atdla widoków "ostatnio zmienione"
Załóż normalny indeks btree na tej kolumnie. Bez niego każde kliknięcie „ostatnie 30 dni” może zamienić się w pełne skanowanie tabeli.
Presety zakresów często wyglądają jak created_at >= now() - interval '30 days'. To warunek zakresowy i indeks na created_at możesz efektywnie wykorzystać. Jeśli UI sortuje również po najnowszych, dopasowanie kierunku sortowania (np. created_at DESC) może pomóc na mocno używanych listach.
Gdy zakresy dat łączą się z innymi filtrami (status, assignee), bądź selektywny. Indeksy złożone są świetne, gdy kombinacja jest powszechna. W przeciwnym razie dodają koszty zapisu bez korzyści.
Zasady praktyczne:
- Jeśli większość widoków filtruje po statusie, a potem po dacie,
(status, created_at)może pomóc. - Jeśli status jest opcjonalny, ale data zawsze jest obecna, trzymaj prosty indeks
created_ati unikaj wielu złożonych indeksów. - Nie twórz każdej możliwej kombinacji. Każdy nowy indeks zwiększa przechowywanie i spowalnia zapisy.
Strefy czasowe i granice powodują dużo błędów "braku rekordów". Jeśli użytkownicy wybierają daty (bez czasu), ustal, jak interpretować datę końcową. Bezpieczny wzorzec to inkluzywny start i ekskluzywny koniec: created_at >= start i created_at < end_next_day. Przechowuj znaczniki w UTC i konwertuj dane wejściowe użytkownika do UTC przed zapytaniem.
Przykład: admin wybiera 10 stycznia do 12 stycznia i oczekuje elementów z całego 12 stycznia. Jeśli zapytanie użyje <= '2026-01-12 00:00', odetniesz prawie wszystko z 12 stycznia. Indeks tu nie zawinił — logika granic jest niewłaściwa.
Pola tekstowe: wyszukiwanie dokładne vs wyszukiwanie zawierające
Wyszukiwanie tekstowe to miejsce, gdzie wiele paneli admina zwalnia, bo użytkownicy oczekują, że jedno pole znajdzie wszystko. Pierwsza poprawka to rozdzielenie dwóch potrzeb: dopasowanie dokładne (szybkie i przewidywalne) vs wyszukiwanie zawierające (elastyczne, ale cięższe).
Dopasowania dokładne obejmują order ID, ticket number, email, telefon lub zewnętrzne referencje. To idealne kandydaty do normalnych indeksów bazy. Jeśli admini często wklejają ID lub email, prosty indeks i zapytanie równościowe sprawią, że będzie to odczuwalnie natychmiastowe.
Wyszukiwanie zawierające to wtedy, gdy ktoś wpisuje fragment, np. "refund" lub "jan" i oczekuje wyników w nazwiskach, notatkach i opisach. Często realizowane jako LIKE %term%. Prowadzący wildcard zabrania użycia indeksu btree do szybkiego zawężenia, więc baza skanuje wiele wierszy.
Praktyczne podejście do budowy wyszukiwania bez przeciążania bazy:
- Uczyń wyszukiwanie dokładne priorytetem (ID, email, username) i wyraźnie je oznacz.
- Dla wyszukiwania "zaczyna się od" (
term%) standardowy indeks często wystarcza i dla nazw daje dobre wrażenie. - Dodaj wyszukiwanie zawierające tylko wtedy, gdy logi lub skargi pokażą, że jest potrzebne.
- Gdy je dodajesz, użyj właściwego narzędzia (full-text search lub trigramy w PostgreSQL), zamiast liczyć na zwykły indeks do
LIKE %term%.
Zasady wejścia też robią wiele: zmniejszają obciążenie i ujednolicają wyniki:
- Ustal minimalną długość dla wyszukiwania zawierającego (np. 3+ znaki).
- Normalizuj wielkość liter lub używaj porównań niewrażliwych na case konsekwentnie.
- Obcinaj spacje na końcach i początku i redukuj powtórzone spacje.
- Traktuj emaile i ID jako dopasowanie dokładne domyślnie, nawet gdy wpisane w ogólne pole wyszukiwania.
- Jeśli termin jest zbyt ogólny, poproś użytkownika o doprecyzowanie zamiast uruchamiać ogromne zapytanie.
Mały przykład: menedżer wsparcia wyszukuje "ann". Jeśli system wykona LIKE %ann% po notatkach, nazwiskach i adresach, może przeskanować tysiące rekordów. Jeśli najpierw sprawdzisz pola dokładne (email lub ID klienta), a dopiero potem użyjesz inteligentnego indeksu tekstowego, wyszukiwanie pozostanie szybkie bez obciążania bazy.
Krok po kroku: bezpieczne dodawanie indeksów
Indeksy łatwo dodać i łatwo żałować. Bezpieczny workflow skupia się na filtrach, na których polegają admini, i pomaga unikać „może użytecznych" indeksów, które później spowalniają zapisy.
Zacznij od rzeczywistego użycia. Wyciągnij top zapytań na dwa sposoby:
- najczęściej występujące zapytania
- najwolniejsze zapytania
Dla paneli admina to zwykle strony list z filtrami i sortowaniem.
Następnie złap kształt zapytania dokładnie tak, jak widzi to baza. Zapisz precyzyjne WHERE i ORDER BY, włącznie z kierunkiem sortowania i typowymi kombinacjami (np.: status = 'open' AND assignee_id = 42 ORDER BY created_at DESC). Małe różnice mogą zmienić, który indeks pomoże.
Użyj prostego loopa:
- Wybierz jedno wolne zapytanie i jedną zmianę indeksu do wypróbowania.
- Dodaj lub zmodyfikuj pojedynczy indeks.
- Pomiary wykonaj ponownie przy tych samych filtrach i tym samym sortowaniu.
- Sprawdź, czy inserty i aktualizacje nie spowolniły zauważalnie.
- Zachowaj zmianę tylko jeśli wyraźnie poprawia docelowe zapytanie.
Paginacja zasługuje na osobne sprawdzenie. Paginacja offsetowa (OFFSET 20000) często zwalnia w miarę zagłębiania się, nawet z indeksami. Jeśli użytkownicy często docierają bardzo głęboko, rozważ paginację kursora ("pokaż elementy przed tym timestamp/id"), by indeks wykonywał spójną pracę na dużych tabelach.
Na koniec prowadź mały rejestr, żeby lista indeksów była zrozumiała miesiące później: nazwa indeksu, tabela, kolumny (i kolejność) oraz zapytanie, które wspiera.
Typowe błędy indeksowania w panelach admina
Najszybsza droga, by panel admina wydawał się wolny, to dodawać indeksy bez sprawdzenia, jak ludzie faktycznie filtrują, sortują i paginują. Indeksy kosztują przestrzeń i dokładają pracy przy każdej operacji zapisu.
Błędy pojawiające się najczęściej
Te wzorce powodują najwięcej problemów:
- Indeksowanie każdej kolumny "na wszelki wypadek".
- Tworzenie indeksu złożonego z niewłaściwą kolejnością kolumn.
- Ignorowanie sortowania i paginacji.
- Oczekiwanie, że normalny indeks naprawi
LIKE '%term%'. - Pozostawianie starych indeksów po zmianach w UI.
Typowy scenariusz: zespół wsparcia filtruje tickety po Status = Open, sortuje po updated time i paginuje wyniki. Jeśli dodasz tylko indeks na status, baza i tak może zebrać wszystkie open tickety i posortować je. Indeks dopasowany do filtru i sortowania potrafi zwrócić stronę 1 szybko.
Szybkie sposoby na wykrycie problemów
Przed i po zmianach w UI zrób krótką kontrolę:
- Wymień najważniejsze filtry i domyślne sortowanie, potem potwierdź, że istnieje indeks dopasowany do wzorca
WHERE + ORDER BY. - Sprawdź prowadzące wildcardy (
LIKE '%term%') i zdecyduj, czy naprawdę potrzebujesz wyszukiwania zawierającego. - Szukaj duplikujących lub nakładających się indeksów.
- Monitoruj nieużywane indeksy przez jakiś czas, a potem je usuń, gdy będziesz pewien, że nie są potrzebne.
Jeśli budujesz panele admina w AppMaster na PostgreSQL, uczynienie tej przeglądu częścią procesu wdrożenia nowych ekranów jest dobrą praktyką. Właściwe indeksy zwykle wynikają bezpośrednio z filtrów i porządków sortowania, których używa UI.
Szybkie kontrole i kolejne kroki
Zanim dodasz kolejne indeksy, upewnij się, że te, które już masz, pomagają dokładnie tym filtrom, z których korzystają ludzie na co dzień. Dobry panel admina jest błyskawiczny na najważniejszych ścieżkach, nie na rzadkich, jednorazowych wyszukiwaniach.
Kilka kontroli, które wykrywają większość problemów:
- Otwórz najczęściej używane kombinacje filtrów (status, assignee, zakres dat i domyślne sortowanie) i upewnij się, że pozostają szybkie w miarę wzrostu tabeli.
- Dla każdego wolnego widoku sprawdź, że zapytanie używa indeksu dopasowanego zarówno do
WHERE, jak i doORDER BY, a nie tylko do jednej z części. - Trzymaj listę indeksów na tyle małą, żebyś mógł opisać przeznaczenie każdego indeksu w jednym zdaniu.
- Obserwuj operacje intensywnie zapisujące (create, update, zmiana statusu). Jeśli po indeksowaniu stały się wolniejsze, prawdopodobnie masz za dużo lub nakładających się indeksów.
- Zdefiniuj, co oznacza „wyszukiwanie" w UI: dopasowanie dokładne, prefiksowe czy zawierające. Plan indeksów musi odpowiadać temu wyborowi.
Praktyczny następny krok to zapisanie „złotych ścieżek" prostymi zdaniami, np.: "Agenci wsparcia filtrują otwarte tickety przypisane do mnie z ostatnich 7 dni, posortowane po newest." Użyj tych zdań do zaprojektowania małego zestawu indeksów, które wyraźnie je wspierają.
Jeśli jesteś jeszcze we wczesnej fazie budowy, warto wymodelować dane i domyślne filtry zanim stworzysz zbyt wiele ekranów. W AppMaster (appmaster.io) możesz szybko iterować widoki admina, a potem dodać kilka indeksów dopasowanych do realnego użycia, gdy gorące ścieżki się wyklarują.
FAQ
Zacznij od zapytań, które uruchamiają się najczęściej: domyślny widok listy, który administrator widzi zaraz po wejściu, oraz 2–3 filtry, które klika się cały dzień. Zmierz częstotliwość i ból użytkowników (najwolniejsze i najczęściej używane), a potem indeksuj tylko to, co wyraźnie skraca czas oczekiwania dla tych konkretnych kształtów zapytań.
Bo różne filtry wymuszają różną ilość pracy. Jedne zawężają do małego zestawu wierszy, inne dotykają dużych zakresów lub wymagają posortowania obszernego zbioru wyników — w efekcie jedno zapytanie może dobrze korzystać z indeksu, a inne i tak wymusić skanowanie i sortowanie dużej ilości danych.
Nie zawsze. Jeśli większość wierszy ma ten sam status, indeks na samym status często niewiele zmieni. Indeks działa lepiej, gdy status jest rzadki albo gdy indeksuje się status razem z sortowaniem lub innym filtrem, który rzeczywiście zawęża wyniki.
Użyj indeksu złożonego, który odzwierciedla rzeczywisty widok, np. filtrowanie po statusie i sortowanie po ostatnich zmianach. W PostgreSQL indeks częściowy (partial index) może być dobrą opcją, gdy jeden status dominuje — indeks jest wtedy mniejszy i tańszy przy zapisie, a jednocześnie szybki dla typowego widoku.
Prosty indeks na assignee_id często działa dobrze, bo to filtr równościowy. Jeśli jednak często używacie widoku „moje otwarte zgłoszenia", indeks złożony zaczynający się od assignee_id, a potem status (i opcjonalnie kolumna sortująca) zwykle działa lepiej niż oddzielne indeksy jednopokolumnowe.
Często unassigned jest przechowywane jako NULL, a WHERE assignee_id IS NULL może mieć inny plan zapytania niż WHERE assignee_id = 123. Jeśli kolejki "nieprzypisane" są ważne, przetestuj to zapytanie specjalnie i rozważ strategię indeksową wspierającą NULL, np. indeks częściowy na wiersze nieprzypisane, jeśli baza to obsługuje.
Dodaj btree na kolumnę z timestampem, której ludzie faktycznie używają: created_at dla widoków „nowe elementy”, updated_at dla „niedawno zmienione”. Bez tego każde kliknięcie „ostatnie 30 dni” może spowodować pełne skanowanie tabeli. Jeśli UI sortuje od najnowszych, dopasowanie kierunku sortowania w indeksie (np. created_at DESC w PostgreSQL) może pomóc przy mocno używanych listach.
Bo LIKE %term% nie może korzystać z normalnego indeksu btree przy prowadzącym wildcardzie, więc baza często skanuje wiele wierszy. Traktuj wyszukiwania dokładne (ID, email, numer zamówienia) jako priorytetowe i używaj ich jako szybkiej ścieżki. Gdy potrzebujesz wyszukiwania zawierającego fragment, użyj odpowiedniego narzędzia (np. full-text search lub trigramy w PostgreSQL), zamiast polegać na zwykłym indeksie.
Dodawanie zbyt wielu indeksów zwiększa zajętość dysku i spowalnia inserty/aktualizacje, a i tak możesz nie trafić w realne wąskie gardło, jeśli indeks nie pasuje do wzorca WHERE + ORDER BY. Bezpieczniejsze podejście to zmienić jeden indeks na raz, zmierzyć to samo powolne zapytanie i zachować tylko te zmiany, które wyraźnie poprawiają najważniejszą ścieżkę.
Jeśli tworzycie ekrany admina w AppMaster, logujcie dokładne filtry i sorty używane przez zespół, a potem dodajcie mały zestaw indeksów odzwierciedlających te widoki zamiast indeksować każdą możliwą kolumnę.


