Optymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją

  1. Strona główna
  2. Blog
  3. Bazy danych i SQL

Bazy danych i SQL

Optymalizacja zapytań SQL: Przeczytaj plany wykonania i napraw powolne zapytania zgodnie z harmonogramem

Przestań zgadywać, dlaczego zapytanie jest powolne. Naucz się czytać plan wykonania, a następnie zastosuj najważniejsze poprawki, korzystając z pomiarów przed i po z prawdziwej tabeli zawierającej milion wierszy.

9 min czytania
Optymalizacja zapytań SQL: czytaj plany wykonania i naprawiaj wolne zapytania wraz z synchronizacją

Najważniejsze

  • Zacznij od planu wykonania. Mówi ci, co faktycznie robi baza danych.
  • Poszukaj pełnych skanów dużych tabel, a następnie dodaj indeksy pasujące do filtrów i złączeń.
  • Unikaj zawijania indeksowanej kolumny w funkcji, ponieważ może to uniemożliwić efektywne wykorzystanie indeksu.
  • Zmierz przed i po, ponieważ każda baza danych i zbiór danych zachowuje się inaczej.

Zapytanie, które w zeszłym roku trwało milisekundy, dzisiaj może zająć kilka minut, po prostu dlatego, że tabela się rozrosła. Optymalizacja zapytań SQL to mniej sprytne sztuczki, a bardziej powtarzalny proces: dowiedz się, co robi baza danych, usuń zmarnowaną pracę i sprawdź, czy pomogło.

Przetestowaliśmy każdą poniższą technikę na milionie wygenerowanych wierszy w SQLite 3.50. Czasy są najlepsze z kilku przebiegów z jednego laptopa przy użyciu bazy danych w pamięci. Nie będą pasować do Twojego systemu, a PostgreSQL, MySQL i SQL Server mają własne optymalizatory i formaty planów. Skoncentruj się na wielkości każdego ulepszenia i zasadach, które za nim stoją.

Wyniki w skrócie

Technika Przed po
Indeks w kolumnie filtra 73 ms 0,01 ms
Zakres zamiast funkcji w kolumnie 96 ms 33 ms
Indeks złożony dla dwóch filtrów 19 ms 2,2 ms
Zestaw kluczy zamiast głębokiego PRZESUNIĘCIA 8,1 ms 0,01 ms

Konfiguracja testowa

CREATE TABLE customers (
  id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
  id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
  created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values

Prosty proces optymalizacji

  1. Znajdź istotne zapytania. Korzystaj z dzienników wolnych zapytań lub monitorowania. Zapytanie trwające 200 ms i uruchamiane tysiąc razy na minutę może mieć większe znaczenie niż 10-sekundowy raport miesięczny.
  2. Przeczytaj plan. Zobacz, co naprawdę robi baza danych.
  3. Zmień jedną rzecz. Dodaj indeks lub przepisz część zapytania.
  4. Zmierz ponownie na realistycznych danych. Plan obejmujący 100 wierszy testowych niewiele mówi o milionie.
  5. Obserwuj z biegiem czasu. Plany mogą się zmieniać w miarę zwiększania się ilości danych i zmiany statystyk.

Przeczytaj plan wykonania

Plan wykonania to strategia bazy danych dotycząca wykonywania zapytania krok po kroku, obejmująca używane przez nią indeksy i kolejność łączenia tabel. Poprzedź zapytanie, aby je zobaczyć:

Baza danych Polecenie
SQLite WYJAŚNIJ ZAPYTANIE PLAN WYBIERZ...
PostgreSQL WYJAŚNIJ ANALIZUJ WYBIERZ...
MySQL’a EXPLAIN SELECT ... lub EXPLAIN ANALYZE
Serwer SQL Rzeczywisty plan wykonania w SSMS

Zauważ, że EXPLAIN ANALYZE w PostgreSQL naprawdę uruchamia zapytanie, więc zachowaj ostrożność, używając go z UPDATE lub DELETE. Oto, czego należy szukać w pierwszej kolejności:

Widzisz Znaczenie Zwykle
Skanuj lub Skanuj sekwencyjnie Czyta całą tabelę Problem na dużych stołach
Wyszukaj lub przeszukaj indeks Przeskakuje do pasujących wierszy Dobrze
Indeks krycia Odpowiedź pochodzi z samego indeksu Bardzo dobrze
Tymczasowe drzewo B lub sortowanie Dodatkowa praca przy sortowaniu Warto sprawdzić

Pełne skanowanie nie jest automatycznie złe. Jeśli zapytanie zajmuje większość małej tabeli, najszybszym wyborem może być skanowanie. W PostgreSQL EXPLAIN ANALYZE porównaj także szacunkowe wiersze z rzeczywistymi wierszami. Duża różnica często oznacza, że ​​statystyki tabeli są nieaktualne.

Dodaj odpowiedni indeks

To zapytanie wyszukuje zamówienia jednego klienta:

SELECT id, total FROM orders WHERE customer_id = 123;

Przed dodaniem indeksu plan zakładał pełne skanowanie:

SCAN orders
-- 20 rows in 73 ms

Następnie dodaliśmy indeks w kolumnie filtra:

CREATE INDEX idx_orders_customer ON orders(customer_id);

SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms

Te same 20 wierszy wróciło tysiące razy szybciej, ponieważ baza danych nie czytała już miliona wierszy, aby je znaleźć. Żadna inna technika opisana w tym artykule nie zapewniła nam większej wygranej. Dobrymi pierwszymi kandydatami są kolumny używane w WHERE, JOIN i ORDER BY, zwłaszcza gdy zawężają wyniki do kilku wierszy. Nasz przewodnik po indeksach SQL wyjaśnia, jak one działają.

Nie zawijaj indeksowanych kolumn w funkcjach

Oto dwa sposoby na znalezienie zamówień marcowych, z indeksem na created:

-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms

-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms

Oba zwracają identyczne wiersze, ale pierwszy trwał około trzy razy dłużej. Plan pokazuje dlaczego: przy funkcji w kolumnie baza danych nie może przeskoczyć do pozycji w posortowanym indeksie, więc musi przejść SCAN przez każdy wpis. Wersja asortymentowa może SEARCH trafić prosto we właściwe miejsce. Warunek, który może używać indeksu w ten sposób, nazywa się sargable.

Ten sam problem pojawia się w przypadku tych typowych wzorców:

Unikaj Wolę
GDZIE ROK(utworzono) = 2026 GDZIE utworzono >= „2026-01-01” ORAZ utworzono < „2027-01-01”
GDZIE cena * 2 > 100 GDZIE cena > 50
GDZIE DOLNY(e-mail) = „a@b.com” Indeks oparty na funkcjach lub sortowanie bez uwzględniania wielkości liter
GDZIE nazwa JAK „%99” Wyszukiwanie prefiksowe lub wyszukiwanie pełnotekstowe

To ostatnie też sprawdziliśmy. Wygenerowano wiodący symbol wieloznaczny SCAN customers, ponieważ indeks posortowany od pierwszej litery nie może pomóc w dopasowaniu na końcu.

Indeksy złożone

Gdy zapytanie filtruje według dwóch kolumn, indeks jednokolumnowy wykonuje tylko część zadania:

SELECT id FROM orders
WHERE status = 'paid'
  AND created >= '2026-03-01' AND created < '2026-03-08';

-- Using only the created index: 6,198 rows in 19 ms

CREATE INDEX idx_status_created ON orders(status, created);

-- SEARCH orders USING COVERING INDEX idx_status_created
--   (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms

Kolejność kolumn ma ogromne znaczenie. Indeks na (status, created) działa jak książka telefoniczna posortowana według nazwiska, a następnie imienia. Można wyszukiwać samo nazwisko, ale nie samo imię. Nasze zapytanie dotyczące samego status mogłoby skorzystać z tego indeksu. Samo filtrowanie na podstawie created generalnie nie pozwala na jego efektywne wykorzystanie. Ogólna zasada polega na tym, że kolumny testowane z równością należy umieszczać na pierwszym miejscu, a kolumny zakresu po nich.

Plan ten mówi również o indeksie obejmującym, co oznacza, że ​​indeks zawierał wszystko, czego potrzebowało zapytanie, więc sama tabela nie musiała być czytana. Wybranie tylko tych kolumn, których potrzebujesz, zwiększa to prawdopodobieństwo, co jest kolejnym powodem, aby tego unikać SELECT *.

Szybsza paginacja

Używanie OFFSET do głębokich stron jest ukrytym kosztem, ponieważ baza danych nadal musi przejść obok wszystkich pominiętych wierszy:

-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms

-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms

Paginacja zestawu kluczy pozostaje szybka niezależnie od tego, jak głęboko się zagłębisz. Zapobiega także przesuwaniu się wierszy między stronami po dodaniu nowych danych. Kompromis polega na tym, że użytkownicy nie mogą od razu przejść do 5000 stron, co rzadko jest realną potrzebą. W tabelach z szerokimi rzędami lub z większą liczbą wierszy do pominięcia różnica może być znacznie większa niż w naszym teście.

Wskazówka: Nasze czasy mierzą jedno zapytanie na raz na bezczynnym komputerze. Pod prawdziwym obciążeniem nieefektywne zapytanie wyrządza więcej szkód, ponieważ utrzymuje również blokady i konkuruje o pamięć, dysk i procesor ze wszystkim innym.

Pisz prostsze zapytania

  • Wybierz tylko te kolumny, których potrzebujesz. SELECT * wysyła więcej danych i może uniemożliwić indeksowi pokrycie zapytania.
  • Wcześnie filtruj. Użyj WHERE, aby usunąć wiersze przed grupowaniem, a HAVING tylko w przypadku warunków dotyczących agregatów. Zobacz SQL GROUP BY i HAVING.
  • Użyj LIMIT, jeśli potrzebujesz tylko kilku wierszy.
  • Preferuj UNION ALL, jeśli nie chcesz usuwać duplikatów. Nasz test UNION vs UNION ALL pokazuje, jakie to oszczędza.
  • Unikaj niepotrzebnego DISTINCT. Często polega to na ukrywaniu złączenia, które powoduje duplikaty.
  • Do sprawdzania istnienia użyj EXISTS. Może zatrzymać się na pierwszym dopasowaniu, jak wyjaśnia nasz przewodnik po podzapytaniach SQL.
  • Uważaj na N+1 zapytań. Jedno zapytanie na wiersz w pętli, zwykle powodowane przez kod aplikacji, często stanowi prawdziwy problem. Pojedyncze zapytanie łączące lub wsadowe może zastąpić setki podróży w obie strony.

Dołącza

Indeksuj kolumny, do których dołączasz. Wygenerowaliśmy raport dotyczący całkowitych wydatków klientów w jednym mieście i okazało się, że plan był dokładnie taki, jakiego można było oczekiwać:

SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;

-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms

Skanuje klientów, a następnie wykorzystuje indeks, aby znaleźć zamówienia każdego z nich. Bez indeksu na orders.customer_id baza danych musiałaby wykonać znacznie więcej pracy dla każdego klienta. Indeks klucza obcego jest jednym z najpowszechniejszych i najcenniejszych dodatków, jakie można wprowadzić. Aby odświeżyć wiedzę na temat podstaw, zobacz Wyjaśnienie złączeń SQL.

Kiedy indeksy Cię kosztują

Indeksy nie są darmowe, więc nie dodawaj ich dla każdej kolumny:

  • Wolniejsze zapisywanie. Każde wstawienie, aktualizacja i usunięcie musi także zaktualizować każdy indeks.
  • Więcej miejsca i pamięci. Indeksy mogą rosnąć w dużych tabelach.
  • Niewielkie korzyści w przypadku kolumn nieselektywnych. Indeks w kolumnie „prawda” lub „fałsz” może nie pomóc, jeśli większość wierszy jest zgodna.
  • Nadmiarowość. Indeks w (a) jest często niepotrzebny, jeśli już go masz w (a, b).

Sprawdzaj okresowo statystyki użytkowania i usuwaj indeksy, z których nie korzystasz. I utrzymuj świeże statystyki za pomocą ANALYZE lub odpowiednika bazy danych, ponieważ optymalizator opiera się na nich przy wyborze dobrego planu. Czasami powolną częścią jest raczej rywalizacja niż zapytanie. Długotrwałe transakcje trzymające blokady mogą sprawić, że szybkie zapytanie będzie wydawać się powolne.

Typowe błędy

  • Optymalizacja bez pomiaru. Wiele pewnych domysłów okazuje się błędnych.
  • Testowanie na małych danych. Plany i harmonogramy zmieniają się dramatycznie w miarę powiększania się tabel.
  • Zaufanie wskazówce dotyczącej innej bazy danych. Porady dotyczące jednego silnika mogą nie mieć zastosowania w przypadku innego.
  • Dodawanie indeksów na ślepo. Każdy spowalnia zapis.
  • Ignorowanie efektu pierwszego uruchomienia. Pamięci podręczne przyspieszają drugie uruchomienie, więc uruchamiaj je kilka razy.

Podsumowanie

Większość powolnych zapytań ma zwykłe przyczyny: brak indeksu, funkcja w kolumnie lub pobieranie zbyt dużej ilości danych. Weź w tym tygodniu najwolniejsze prawdziwe zapytanie, uruchom na nim EXPLAIN i poszukaj pełnego skanowania na dużym stole. Napraw jedną rzecz, zmierz ponownie i zapisuj, co zmieniłeś.

Najczęstsze pytania

Na czym polega optymalizacja zapytań SQL?

Jest to proces, dzięki któremu zapytania zużywają mniej czasu i zasobów, zwykle poprzez sprawdzanie planów wykonania, dodawanie odpowiednich indeksów i przepisywanie nieefektywnych zapytań.

Co to jest plan wykonania?

Jest to wybrana przez bazę danych strategia wykonywania zapytania, obejmująca sposób odczytu tabel, używanych indeksów i kolejność dołączania.

Jak znaleźć wolne zapytania?

Włącz dziennik wolnych zapytań w bazie danych lub użyj narzędzi takich jak pg_stat_statements w PostgreSQL. Następnie skup się na zapytaniach o najwyższym łącznym czasie.

Czy dodanie indeksu zawsze przyspiesza wykonywanie zapytań?

Nie. Pomaga w selektywnym czytaniu, ale spowalnia zapis i zużywa pamięć. Optymalizator może go również zignorować, jeśli większość wierszy spełnia warunek.

Czy SELECT * ma szkodliwy wpływ na wydajność?

To może być. Przesyła niepotrzebne dane i może uniemożliwić indeksowi pokrycie zapytania. Zwykle lepszym rozwiązaniem jest wyświetlenie tylko potrzebnych kolumn.

Ucz się dalej

Pracuj z Stack Quora

Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?

Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.

Czytaj dalej

Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój

Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.

Sztuczna inteligencja

Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć

Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…

Przeczytaj artykuł →
DevOps

Wyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo

Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429

Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …

Przeczytaj artykuł →
Automatyzacja testów

Wyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią

Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…

Przeczytaj artykuł →
Testowanie oprogramowania

Wyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%

Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…

Przeczytaj artykuł →
Bazy danych i SQL

DELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich

DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami

Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…

Przeczytaj artykuł →
Tworzenie oprogramowania

Interfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora

Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…

Przeczytaj artykuł →
Tworzenie oprogramowania

Python *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami

Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…

Przeczytaj artykuł →
Tworzenie oprogramowania

Funkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać

Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…

Przeczytaj artykuł →
Sztuczna inteligencja

Kim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić

Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…

Przeczytaj artykuł →
DevOps

Monitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami

Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…

Przeczytaj artykuł →
DevOps

Woluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób

Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…

Przeczytaj artykuł →
Automatyzacja testów

TDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich

TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…

Przeczytaj artykuł →
Testowanie oprogramowania

Testowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady

Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać

Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…

Przeczytaj artykuł →
Bazy danych i SQL

Instrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy

SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…

Przeczytaj artykuł →
Tworzenie oprogramowania

Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami

Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom

Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …

Przeczytaj artykuł →
Sztuczna inteligencja

Czym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa

Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…

Przeczytaj artykuł →
DevOps

Wdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru

Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…

Przeczytaj artykuł →
Automatyzacja testów

Niestabilne testy: co je powoduje i jak je naprawić na dobre

Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…

Przeczytaj artykuł →
Testowanie oprogramowania

Load Testing vs Stress Testing: Differences, Metrics and k6 Examples

Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…

Przeczytaj artykuł →
Testowanie oprogramowania

Przypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich

Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…

Przeczytaj artykuł →
Bazy danych i SQL

Optymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją

Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…

Przeczytaj artykuł →
Bazy danych i SQL

SQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność

SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu

Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…

Przeczytaj artykuł →
Tworzenie oprogramowania

Obsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami

Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…

Przeczytaj artykuł →
Tworzenie oprogramowania

Klasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami

Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu

Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…

Przeczytaj artykuł →
DevOps

Polecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami

Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…

Przeczytaj artykuł →
Automatyzacja testów

Selenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór

Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…

Przeczytaj artykuł →
Testowanie oprogramowania

Partycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach

Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…

Przeczytaj artykuł →
Testowanie oprogramowania

Ważność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady

Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…

Przeczytaj artykuł →
Bazy danych i SQL

Samouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami

Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…

Przeczytaj artykuł →
Tworzenie oprogramowania

Ściągawka dotycząca poleceń Git: polecenia, których faktycznie używasz, z przykładami

Ściągawka poleceń Git pogrupowana według zadań: konfiguracja, przemieszczanie, gałęzie, piloty, skrytka, historia i cofanie błędów, z danymi wyjścio…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie obietnic JavaScript: następnie catch, Promise.all i typowe błędy

Obietnice JavaScript wyjaśnione za pomocą uruchomionego przez nas kodu: stany, łańcuchy then i catch, obsługa błędów, Promise.all, allSettled, race …

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek słownika języka Python: metody, przykłady i typowe wzorce

Samouczek słownika języka Python z uruchomionym przez nas kodem: tworzenie, odczytywanie i aktualizowanie słowników, metody kluczowych, łączenie, ro…

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest RAG? Generacja rozszerzona o wyszukiwanie wyjaśniona na przykładzie roboczym

Co to jest RAG? Generowanie wspomagane pobieraniem wyjaśnione krok po kroku: indeksowanie, fragmentowanie, osadzanie, pobieranie, mały działający pr…

Przeczytaj artykuł →
DevOps

Samouczek Terraform dla początkujących: Infrastruktura jako kod od pierwszego pliku do modułów

Samouczek Terraform dla początkujących: zacznij bez konta w chmurze, naucz się inicjowania, planowania i stosowania, a następnie zmiennych, wyników,…

Przeczytaj artykuł →
DevOps

Docker kontra Kubernetes: kluczowe różnice, jak ze sobą współpracują i czego potrzebujesz

Wyjaśniono Docker vs Kubernetes: co robi każdy z nich, ta sama aplikacja działa z obydwoma, porównanie Docker Compose i Swarm, zmiana podkładki dock…

Przeczytaj artykuł →
Automatyzacja testów

Samouczek Pytest dla początkujących: urządzenia, parametryzacja i prawdziwe przykłady

Samouczek pytest dla początkujących z testami, które przeprowadziliśmy na pytest 9.2: asercje, urządzenia, parametryzacja, conftest, znaczniki, tmp_…

Przeczytaj artykuł →
Testowanie oprogramowania

Cykl życia testowania oprogramowania (STLC): 6 faz, kryteria wejścia i wyjścia, przykład

Wyjaśniono cykl życia testowania oprogramowania: sześć faz STLC z kryteriami wejścia i wyjścia, elementy dostarczane, działający przykład funkcji lo…

Przeczytaj artykuł →
Tworzenie oprogramowania

Git merge vs rebase: różnice, przykłady i kiedy czego używać

Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.

Przeczytaj artykuł →
Tworzenie oprogramowania

Python list comprehension: składnia, przykłady i kiedy jej unikać

Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…

Przeczytaj artykuł →
Bazy danych i SQL

SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)

Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…

Przeczytaj artykuł →