Indeksy częściowe i indeksy wyrażeń
Indeksować tylko potrzebne wiersze za pomocą klauzul WHERE oraz indeksować wyliczane wyrażenia (lower(email), date_trunc('day', ts))
Indeksy częściowe i indeksy wyrażeń to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Indeks częściowy: indeksowanie podzbioru
Indeks częściowy obejmuje tylko wiersze spełniające klauzulę WHERE w chwili tworzenia indeksu. Jest mniejszy, szybszy i świetnie sprawdza się w przypadku zapytań dla najczęstszego scenariusza:
CREATE INDEX users_active_email_idx
ON users(email)
WHERE deleted_at IS NULL;Kiedy indeksy częściowe się sprawdzają
Należy ich używać, gdy:
- Zawsze filtrują Państwo według tego samego predykatu (np. dla logicznego usuwania)
- Jedna wartość dominuje w kolumnie (np. 95% wierszy ma status='closed')
- Potrzebny jest mały, często używany indeks mieszczący się w pamięci podręcznej
Przykład: aktywne sesje
Większość sesji wygasła; wyszukiwane są tylko aktywne:
CREATE INDEX sessions_active_idx ON sessions(user_id)
WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.Lepsze rozwiązanie: stabilny predykat
Predykat indeksu musi być immutable. Wyrażenia zależne od czasu (NOW()) nie spełniają tego warunku. Zamiast nich należy użyć kolumny takiej jak is_active:
CREATE INDEX sessions_active_idx ON sessions(user_id)
WHERE is_active = true;
-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;Indeks wyrażenia
Indeksowanie funkcji kolumny:
CREATE INDEX users_email_lower_idx ON users(LOWER(email));
SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.Typowe indeksy wyrażeń
LOWER(email)do wyszukiwania bez uwzględniania wielkości liter(price * tax_rate)do sortowania według wartości obliczanejdate_trunc('day', created_at)do raportów dziennych(data ->> 'user_id')::BIGINTdo wyodrębniania danych JSONB
Wyrażenie musi być IMMUTABLE
Wyrażenie musi być oznaczone jako IMMUTABLE — jego wynik zależy wyłącznie od danych wejściowych. RANDOM(), NOW() i CURRENT_USER nie spełniają tego warunku.
Połączenie indeksu częściowego i wyrażenia
Oba rozwiązania można połączyć:
CREATE INDEX articles_active_title_idx
ON articles(LOWER(title))
WHERE published_at IS NOT NULL;Unikatowe indeksy częściowe
Klasyczny wzorzec „jednego aktywnego wiersza”:
CREATE UNIQUE INDEX users_one_active_email
ON users(email)
WHERE deleted_at IS NULL;
-- Same email can exist many times in deleted users, but only once active.Predykat indeksu musi pasować do zapytania
Optymalizator używa indeksu częściowego tylko wtedy, gdy klauzula WHERE zapytania „implikuje” predykat indeksu:
-- Index: WHERE is_active = true
-- Match: WHERE is_active = true AND user_id = 42 ✓
-- Match: WHERE is_active AND user_id = 42 ✓
-- No: WHERE user_id = 42 ✗
-- No: WHERE is_active IS NOT FALSE ✗ (logically same but planner may not realise)Nie należy ich nadużywać
Wiele indeksów częściowych obejmujących rozłączne podzbiory może spowalniać zapis (każdy INSERT musi aktualizować wszystkie odpowiednie indeksy). Należy używać ich oszczędnie w przypadku często wykonywanych zapytań.
Podsumowanie
Indeksy częściowe i indeksy wyrażeń zapewniają większą wydajność przy mniejszym rozmiarze.
- Częściowy: indeksuje tylko podzbiór danych, którego Państwo szukają
- Wyrażenia: indeksują obliczone wartości
- Oba wymagają predykatów IMMUTABLE
- Zapytanie musi używać tego samego predykatu, aby indeks został dopasowany
Szybkie sprawdzenie
Potrzebne są wyszukiwania adresów e-mail bez uwzględniania wielkości liter. Który indeks jest najbardziej wydajny?
Często zadawane pytania
Czy lekcja „Indeksy częściowe i indeksy wyrażeń” jest bezpłatna?
Tak — pełny tekst „Indeksy częściowe i indeksy wyrażeń” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Indeksy częściowe i indeksy wyrażeń”?
Indeksować tylko potrzebne wiersze za pomocą klauzul WHERE oraz indeksować wyliczane wyrażenia (lower(email), date_trunc('day', ts)) Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Indeksy częściowe i indeksy wyrażeń”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Indeksy B-tree a Hash a GiST a GIN
- Indeksy złożone i kolejność kolumn
- Indeksy częściowe i indeksy wyrażeń
- Konserwacja indeksów i bloat