{"id":21010,"date":"2026-08-26T08:33:40","date_gmt":"2026-08-26T06:33:40","guid":{"rendered":"https:\/\/webhosting.de\/mysql-explain-analyze-abfragen-interpretieren-query-tuning\/"},"modified":"2026-08-26T08:33:40","modified_gmt":"2026-08-26T06:33:40","slug":"interpretacja-zapytan-mysql-explain-analyze-oraz-optymalizacja-zapytan","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pl\/mysql-explain-analyze-abfragen-interpretieren-query-tuning\/","title":{"rendered":"MySQL EXPLAIN ANALYZE: Jak prawid\u0142owo interpretowa\u0107 zapytania, aby uzyska\u0107 maksymaln\u0105 wydajno\u015b\u0107"},"content":{"rendered":"<p>Za pomoc\u0105 polecenia `mysql explain` analizuj\u0119, w jaki spos\u00f3b MySQL 8 tworzy plan <strong>wykonuje<\/strong> oraz kt\u00f3re etapy tego procesu zajmuj\u0105 wymierny czas. W ten spos\u00f3b, na podstawie rzeczywistych czas\u00f3w wykonania, liczby wierszy i p\u0119tli, rozpoznaj\u0119, gdzie nale\u017cy dostosowa\u0107 plan i <strong>Wydajno\u015b\u0107<\/strong> celowo zwi\u0119kszam liczb\u0119 moich zapyta\u0144.<\/p>\n\n<h2>Punkty centralne<\/h2>\n\n<p>Aby\u015b od razu trafi\u0142 w sedno, pokr\u00f3tce podsumuj\u0119 najwa\u017cniejsze cele nauczania i przedstawi\u0119 odpowiednie <strong>Priorytety<\/strong>. Ka\u017cdy wiersz w planie opowiada jak\u0105\u015b histori\u0119, a ja poka\u017c\u0119 ci, na co naprawd\u0119 <strong>zwraca\u0142e\u015b uwag\u0119<\/strong>. Przeczytaj poni\u017csze punkty, sprawd\u017a swoje zapytania i od razu wykorzystaj te spostrze\u017cenia do optymalizacji.<\/p>\n<ul>\n  <li><strong>Rzeczywiste czasy pracy<\/strong>: EXPLAIN ANALYZE wykonuje zapytanie i mierzy czas trwania poszczeg\u00f3lnych etap\u00f3w.<\/li>\n  <li><strong>Szacunki a rzeczywisto\u015b\u0107<\/strong>: Du\u017ce odchylenia wskazuj\u0105 na b\u0142\u0119dne dane statystyczne lub brak wska\u017anik\u00f3w.<\/li>\n  <li><strong>Format TREE<\/strong>: Schemat w postaci drzewa uwidacznia iteratory, filtry i po\u0142\u0105czenia.<\/li>\n  <li><strong>Hotspoty<\/strong>: D\u0142ugi czas do ostatniego rz\u0119du i du\u017ca liczba p\u0119tli wskazuj\u0105 cele strojenia.<\/li>\n  <li><strong>Strategia indeksowa<\/strong>: Odpowiednie (w tym z\u0142o\u017cone) indeksy znacznie obni\u017caj\u0105 koszty.<\/li>\n<\/ul>\n<p>Lista ta daje ci jasny <strong>kierunek<\/strong>, ale dopiero podczas praktycznego zapoznawania si\u0119 z planem mo\u017cesz z po\u017cytkiem wykorzysta\u0107 t\u0119 wiedz\u0119. Zaraz potem poka\u017c\u0119, jak oceniam ka\u017cdy wska\u017anik i jakie s\u0105 kolejne <strong>Kroki<\/strong> z czego wywnioskuj\u0119.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/mysql-analyse-buero-8723.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>EXPLAIN a EXPLAIN ANALYZE: Co tak naprawd\u0119 mierz\u0119<\/h2>\n\n<p>Dzi\u0119ki klasycznemu EXPLAIN widz\u0119 planowan\u0105 \u015bcie\u017ck\u0119 dzia\u0142ania optymalizatora, czyli <strong>Projekt<\/strong> wraz z szacunkowymi kosztami i liczb\u0105 wierszy. Plan ten ujawnia kolejno\u015b\u0107 tabel, u\u017cywane indeksy oraz strategi\u0119 po\u0142\u0105cze\u0144, jednak bez rzeczywistych <strong>Zmierzone warto\u015bci<\/strong>. Polecenie EXPLAIN ANALYZE kontynuuje dzia\u0142anie i faktycznie wykonuje zapytanie, mierz\u0105c czasy do pierwszego i ostatniego wiersza, a tak\u017ce liczb\u0119 p\u0119tli. Dzi\u0119ki temu od razu widz\u0119, kt\u00f3ry w\u0119ze\u0142 drzewa zajmuje najwi\u0119cej czasu i od czego zacz\u0105\u0107. W ten spos\u00f3b zast\u0119puj\u0119 domys\u0142y danymi pomiarowymi <strong>Dane<\/strong> i podejmuj\u0119 przemy\u015blane decyzje dotycz\u0105ce optymalizacji.<\/p>\n\n<h2>Sk\u0142adnia i typowe zastosowania<\/h2>\n\n<p>Rozpoczynam analiz\u0119 od prostego polecenia: <code>EXPLAIN ANALYZE SELECT ...<\/code>, poniewa\u017c dzi\u0119ki temu mog\u0119 od razu <strong>Czas pracy<\/strong> na ka\u017cdy w\u0119ze\u0142. Wynik w formacie TREE pokazuje iteratory, takie jak skanowania, po\u0142\u0105czenia, sortowania i filtry, wraz z szacunkowymi i rzeczywistymi <strong>Linie<\/strong>. Korzystam z tego zw\u0142aszcza w przypadku powtarzaj\u0105cych si\u0119 zapyta\u0144 dotycz\u0105cych problem\u00f3w, operacji UPDATE\/DELETE obejmuj\u0105cych wiele tabel oraz instrukcji zawieraj\u0105cych ORDER BY lub GROUP BY. Opcjonalnie pomaga mi <code>FORMAT=JSON<\/code>, je\u015bli chc\u0119 dog\u0142\u0119bnie przyjrze\u0107 si\u0119 modelowi kosztowemu, ale do codziennego dostrajania zazwyczaj wystarcza drzewo. Kto chce zag\u0142\u0119bi\u0107 si\u0119 w kwestie zwi\u0105zane z Optimizerem, znajdzie cenne wskaz\u00f3wki w <a href=\"https:\/\/webhosting.de\/pl\/mysql-optymalizator-zapytan-hosting-optymalizacja-serverboost\/\">Szczeg\u00f3\u0142y dotycz\u0105ce optymalizatora<\/a>, z kt\u00f3rych korzystam w praktyce.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/mysql_meeting_9245.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Oto jak interpretuj\u0119 plan TREE<\/h2>\n\n<p>Ka\u017cdy w\u0119ze\u0142 traktuj\u0119 jako odr\u0119bny etap, kt\u00f3ry generuje dane lub <strong>filtruje<\/strong>. Operacje skanowania zwracaj\u0105 wiersze z tabel lub indeks\u00f3w, operacje po\u0142\u0105cze\u0144 \u0142\u0105cz\u0105 strumienie, filtry ograniczaj\u0105 liczb\u0119 wierszy, a operacje sortowania porz\u0105dkuj\u0105 lub grupuj\u0105 <strong>Wyniki<\/strong>. Pola \u201erows (actual\/estimated)\u201c, \u201etime to first row\u201c, \u201etime to last row\u201c i \u201eloops\u201c s\u0105 dla mnie najwa\u017cniejszymi wskaz\u00f3wkami. Je\u015bli rzeczywista liczba wierszy znacznie odbiega od szacunk\u00f3w, koryguj\u0119 statystyki lub indeksy. Je\u015bli czas do ostatniego wiersza (time to last row) znacznie si\u0119 wyd\u0142u\u017ca, sprawdzam p\u00f3\u017ane sortowania, du\u017ce po\u0142\u0105czenia (joins) lub nieodpowiednie <strong>Filtry<\/strong>.<\/p>\n\n<h2>Zrozumienie kluczowych wska\u017anik\u00f3w: od szacunk\u00f3w do rzeczywisto\u015bci<\/h2>\n\n<p>Podsumuj\u0119 najwa\u017cniejsze wska\u017aniki w przejrzystej tabeli, aby\u015b m\u00f3g\u0142 szybko rozpozna\u0107 typowe sygna\u0142y <strong>uznanie<\/strong>. Ka\u017cdy wiersz wyja\u015bnia, co oznacza dany wska\u017anik, jakie sygna\u0142y ostrzegawcze dostrzegam i jakie dzia\u0142ania zazwyczaj <strong>Pomaga<\/strong>.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Kluczowa liczba<\/th>\n      <th>Znaczenie<\/th>\n      <th>sygna\u0142 ostrzegawczy<\/th>\n      <th>Podej\u015bcie do tuningu<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>wiersze (szacunkowe\/rzeczywiste)<\/td>\n      <td>Planowane a rzeczywiste <strong>Linie<\/strong><\/td>\n      <td>Du\u017ca r\u00f3\u017cnica (np. 10 w por\u00f3wnaniu z 100 000)<\/td>\n      <td>Od\u015bwie\u017cy\u0107 statystyki, uzupe\u0142ni\u0107 brakuj\u0105ce <strong>Wska\u017aniki<\/strong> czek<\/td>\n    <\/tr>\n    <tr>\n      <td>czas do pierwszego rz\u0119du<\/td>\n      <td>Czas do pierwszej <strong>Problem<\/strong><\/td>\n      <td>Powoli, mimo niewielkiej liczby wynik\u00f3w<\/td>\n      <td>Sprawd\u017a w\u0119ze\u0142 startowy, wczesne filtry <strong>wzmocnienie<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>czas do ostatniego wiersza<\/td>\n      <td>Ca\u0142kowity czas trwania <strong>W\u0119z\u0142y<\/strong><\/td>\n      <td>Znacznie wy\u017cej ni\u017c \u201efirst row\u201c<\/td>\n      <td>Sortowanie, strategia \u0142\u0105czenia, strumienie <strong>zmniejsza\u0107 si\u0119<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>p\u0119tle<\/td>\n      <td>Cz\u0119stotliwo\u015b\u0107 <strong>Powt\u00f3rka<\/strong><\/td>\n      <td>Bardzo wiele iteracji<\/td>\n      <td>Zmiana kolejno\u015bci po\u0142\u0105cze\u0144, podzapytania <strong>obr\u00f3bka plastyczna<\/strong><\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/mysql-explain-analyze-performance-8159.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Prawid\u0142owa interpretacja operator\u00f3w: skanowanie, po\u0142\u0105czenia, sortowanie<\/h2>\n\n<p>Zwracam uwag\u0119 na to, kt\u00f3ry <strong>Iterator<\/strong> kto faktycznie wykonuje t\u0119 prac\u0119:<\/p>\n<ul>\n  <li><strong>Zakres indeksu\/skanowanie unikalne<\/strong>: Idealne rozwi\u0105zanie w przypadku selektywnych warunk\u00f3w WHERE i pasuj\u0105cych prefiks\u00f3w; \u201eczas do pierwszego wiersza\u201c jest kr\u00f3tki, a \u201eczas do ostatniego wiersza\u201c zale\u017cy od liczby wynik\u00f3w.<\/li>\n  <li><strong>Przegl\u0105danie tabeli<\/strong>: Sygna\u0142 ostrzegawczy w przypadku du\u017cych tabel; szukam w\u00f3wczas odpowiednich filtr\u00f3w, indeks\u00f3w z\u0142o\u017conych lub innego sformu\u0142owania zapytania.<\/li>\n  <li><strong>\u0141\u0105czenie z zagnie\u017cd\u017conymi p\u0119tlami<\/strong>: Strategia standardowa; du\u017ca liczba \u201ep\u0119tli\u201c wskazuje na nieodpowiedni sterownik lub brak indeksu w tabeli wewn\u0119trznej.<\/li>\n  <li><strong>\u0141\u0105czenie typu hash<\/strong> (MySQL 8): Dobrze sprawdza si\u0119 w przypadku du\u017cych, r\u00f3wnomiernie roz\u0142o\u017conych po\u0142\u0105cze\u0144 typu Equi-Join. Czas do pierwszego wiersza (\u201etime to first row\u201c) mo\u017ce by\u0107 d\u0142u\u017cszy (w fazie kompilacji), ale czas do ostatniego wiersza (\u201etime to last row\u201c) ulega skr\u00f3ceniu, je\u015bli strumie\u0144 danych pr\u00f3bnych jest du\u017cy.<\/li>\n  <li><strong>Sortuj<\/strong>\/<strong>Grupa<\/strong>: W TREE wyra\u017anie widoczne jako osobne w\u0119z\u0142y. D\u0142ugie czasy wykonania cz\u0119sto wskazuj\u0105 na brak wsparcia ze strony indeks\u00f3w.<\/li>\n  <li><strong>Filtry<\/strong>: P\u00f3\u017ane filtry wskazuj\u0105 na niewykorzystane mo\u017cliwo\u015bci zastosowania indeksowego sprowadzania warunk\u00f3w (Index Condition Pushdown) lub wcze\u015bniejszej selekcji.<\/li>\n<\/ul>\n<p>Je\u015bli w\u0119ze\u0142 sortowania dominuje pod wzgl\u0119dem \u201eczasu do ostatniego wiersza\u201c, sprawdzam, czy po\u017c\u0105dan\u0105 kolejno\u015b\u0107 mo\u017cna uzyska\u0107 za pomoc\u0105 indeksu, na przyk\u0142ad poprzez <strong>Ok\u0142adka<\/strong>-Indeksy z odpowiedni\u0105 kolejno\u015bci\u0105 sortowania. Je\u015bli klauzula ORDER BY jest zgodna z definicj\u0105 indeksu (kierunek, prefiks), etap sortowania cz\u0119sto zostaje ca\u0142kowicie pomini\u0119ty.<\/p>\n\n<h2>Metodologia pomiaru: jak dokonywa\u0107 rzetelnych por\u00f3wna\u0144<\/h2>\n\n<p>Nie ograniczam si\u0119 do jednego pomiaru. Efekty buforowania mog\u0105 zniekszta\u0142ca\u0107 wynik, dlatego:<\/p>\n<ul>\n  <li>Wykonywuj\u0119 polecenie EXPLAIN ANALYZE kilkakrotnie i oceniam median\u0119 oraz rozst\u0119p zamiast pojedynczej warto\u015bci.<\/li>\n  <li>Rozr\u00f3\u017cniam pami\u0119\u0107 podr\u0119czn\u0105 typu \u201ecold\u201c i \u201ewarm\u201c: pomiary typu \u201ewarm\u201d pokazuj\u0105, czego do\u015bwiadczaj\u0105 u\u017cytkownicy po pierwszym uruchomieniu.<\/li>\n  <li>Zmieniam parametry reprezentatywne, aby plan nie wygl\u0105da\u0142 dobrze tylko w przypadku trywialnego przyk\u0142adu.<\/li>\n  <li>Dokumentuj\u0119 schemat i stan danych, aby p\u00f3\u017aniej m\u00f3c prze\u015bledzi\u0107 wyniki.<\/li>\n<\/ul>\n<p>W przypadku instrukcji DML (UPDATE\/DELETE) korzystam z transakcji: <code>START TRANSACTION; EXPLAIN ANALYZE UPDATE ...; ROLLBACK;<\/code>. W ten spos\u00f3b uzyskuj\u0119 rzeczywiste warto\u015bci pomiarowe bez trwa\u0142ych zmian. Wa\u017cne: EXPLAIN ANALYZE <strong>prowadzi<\/strong> \u2013 dlatego w systemach produkcyjnych stosuj\u0119 go z rozwag\u0105.<\/p>\n\n<h2>Statystyki i rozk\u0142ad danych: jak wyeliminowa\u0107 b\u0142\u0119dy estymacji<\/h2>\n\n<p>Du\u017ce r\u00f3\u017cnice mi\u0119dzy wierszami \u201eestimated\u201c a \u201eactual\u201c wynikaj\u0105 cz\u0119sto z nier\u00f3wnomiernego rozk\u0142adu danych. W takiej sytuacji stosuj\u0119 dwutorowe podej\u015bcie:<\/p>\n<ul>\n  <li><strong>Zaktualizuj statystyki<\/strong>: Dbam o to, by optymalizator dysponowa\u0142 aktualnymi informacjami. Najnowsze statystyki poprawiaj\u0105 wyb\u00f3r po\u0142\u0105cze\u0144 i indeks\u00f3w.<\/li>\n  <li><strong>Korzystanie z histogram\u00f3w<\/strong>: W przypadku kolumn o du\u017cym sko\u015bno\u015bci histogramy pomagaj\u0105 w bardziej realistycznym oszacowaniu selektywno\u015bci. W EXPLAIN ANALYZE r\u00f3\u017cnica mi\u0119dzy oszacowaniem a rzeczywist\u0105 warto\u015bci\u0105 wyra\u017anie si\u0119 zmniejsza.<\/li>\n<\/ul>\n<p>Je\u015bli po od\u015bwie\u017ceniu dane szacunkowe nadal b\u0119d\u0105 niedok\u0142adne, sprawdzam indeksy z\u0142o\u017cone w kolejno\u015bci wed\u0142ug najbardziej selektywnych predykat\u00f3w i analizuj\u0119 korelacje mi\u0119dzy kolumnami. Celem jest, aby jak najwcze\u015bniej do kosztownych operator\u00f3w trafia\u0142o jak najmniej dobrze wst\u0119pnie przefiltrowanych wierszy.<\/p>\n\n<h2>Strategie semi-join i podzapytania<\/h2>\n\n<p>MySQL 8 cz\u0119sto przekszta\u0142ca predykaty IN\/EXISTS w plany typu semi-join. W widoku TREE widz\u0119 to jako materializacj\u0119, FirstMatch lub lu\u017ane przeszukiwanie indeksu. Zwracam uwag\u0119 na:<\/p>\n<ul>\n  <li><strong>Materializacja<\/strong>: Podzbi\u00f3r tworzy si\u0119 raz, a nast\u0119pnie wykorzystuje si\u0119 go wielokrotnie \u2013 rozwi\u0105zanie to sprawdza si\u0119 w przypadku umiarkowanej wielko\u015bci.<\/li>\n  <li><strong>FirstMatch<\/strong>: Zatrzymaj si\u0119 wcze\u015bnie po pierwszym trafieniu \u2013 pozwala to zaoszcz\u0119dzi\u0107 p\u0119tle, gdy spodziewana jest niewielka liczba trafie\u0144 na zewn\u0119trzny rz\u0105d.<\/li>\n  <li><strong>Skanowanie indeksu lu\u017anego<\/strong>: Bardzo wydajne w przypadku wzorc\u00f3w podobnych do DISTINCT przy u\u017cyciu indeks\u00f3w.<\/li>\n<\/ul>\n<p>Podzapytania, kt\u00f3re s\u0105 wykonywane dla ka\u017cdego wiersza tabeli zewn\u0119trznej, powoduj\u0105 nadmierne wyd\u0142u\u017cenie \u201ep\u0119tli\u201c. Przekszta\u0142cam je w operatory JOIN lub celowo je materializuj\u0119 (CTE\/Derived), aby plan wykona\u0142 kosztowne operacje tylko raz, a nast\u0119pnie odwo\u0142ywa\u0142 si\u0119 do nich w spos\u00f3b wydajniejszy.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/mysql_analyze_4892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Ukierunkowana optymalizacja kodu SQL: krok po kroku<\/h2>\n\n<p>Zaczn\u0119 od strategii indeksowej i zabezpiecz\u0119 cz\u0119sto wyst\u0119puj\u0105ce warunki WHERE oraz JOIN za pomoc\u0105 <strong>Wska\u017aniki<\/strong> . Je\u015bli potrzebuj\u0119 kilku kolumn do filtrowania lub sortowania, ustawiam indeksy z\u0142o\u017cone i dostosowuj\u0119 kolejno\u015b\u0107 kolumn do najcz\u0119\u015bciej wyst\u0119puj\u0105cych <strong>predykaty<\/strong>. Nast\u0119pnie optymalizuj\u0119 podzapytania wykonywane w p\u0119tlach, przeformu\u0142owuj\u0105c je lub przekszta\u0142caj\u0105c w po\u0142\u0105czenia. Zast\u0119puj\u0119 SELECT * konkretnymi kolumnami, aby przenosi\u0107 mniej danych i odci\u0105\u017cy\u0107 plan. Nast\u0119pnie dbam o aktualno\u015b\u0107 statystyk, poniewa\u017c niedok\u0142adne szacunki kieruj\u0105 optymalizator na <strong>Aberracje<\/strong>.<\/p>\n\n<h2>Praktyka tworzenia indeksu: pokrycie, kolejno\u015b\u0107, eksperymenty<\/h2>\n\n<p>Korzystam z trzech prostych opcji, kt\u00f3re s\u0105 od razu widoczne w poleceniu EXPLAIN ANALYZE:<\/p>\n<ul>\n  <li><strong>Wska\u017aniki pokrycia<\/strong>: Je\u015bli indeks zawiera wszystkie potrzebne kolumny (filtr, po\u0142\u0105czenie, projekcja), plan oszcz\u0119dza operacje wyszukiwania w tabeli. Czas potrzebny do dotarcia do ostatniego wiersza cz\u0119sto znacznie si\u0119 skraca.<\/li>\n  <li><strong>Kolejno\u015b\u0107 kolumn<\/strong>: Sortuj\u0119 wed\u0142ug selektywno\u015bci i rodzaju wykorzystania (filtr przed sortowaniem). W przypadku ORDER BY\/GROUP BY stosuj\u0119 w\u0142a\u015bciwy kierunek i odpowiedni prefiks.<\/li>\n  <li><strong>Eksperymenty z indeksami<\/strong>: Za pomoc\u0105 tymczasowych, <em>niewidoczne<\/em> Sprawdzam, czy optymalizator wybra\u0142by te indeksy bez zak\u0142\u00f3cania istniej\u0105cych plan\u00f3w. Je\u015bli plan ulegnie poprawie, aktywuj\u0119 indeks na sta\u0142e.<\/li>\n<\/ul>\n<p>Je\u015bli istnieje kilka indeks\u00f3w kandyduj\u0105cych, por\u00f3wnuj\u0119 plany za pomoc\u0105 polecenia EXPLAIN ANALYZE i konsekwentnie mierz\u0119 \u201eczas do ostatniego wiersza\u201c. W razie w\u0105tpliwo\u015bci wybieram plan o najbardziej stabilnym czasie wykonania przy r\u00f3\u017cnych warto\u015bciach parametr\u00f3w.<\/p>\n\n<h2>Przyk\u0142ad praktyczny: analiza planu, ustalenie wska\u017anik\u00f3w, pomiar skuteczno\u015bci<\/h2>\n\n<p>Wezm\u0119 na przyk\u0142ad cz\u0119ste zapytanie: <code>EXPLAIN ANALYZE SELECT o.id, o.date, c.name FROM orders o JOIN customers c ON c.id = o.customer_id WHERE o.date &gt;= '2025-01-01' ORDER BY o.date DESC;<\/code> i najpierw sprawd\u017a w\u0119ze\u0142 dla tabeli <strong>zam\u00f3wienia<\/strong>. Je\u015bli plan wskazuje du\u017c\u0105 liczb\u0119 rzeczywistych wierszy oraz pe\u0142ne przeszukiwanie tabeli, tworz\u0119 odpowiedni indeks, na przyk\u0142ad na <code>zam\u00f3wienia(data, id_klienta)<\/code>. Nast\u0119pnie por\u00f3wnuj\u0119 warto\u015b\u0107 \u201etime to last row\u201c przed i po zmianie, poniewa\u017c liczba ta bardzo wyra\u017anie odzwierciedla og\u00f3lny efekt <strong>pokazy<\/strong>. Je\u015bli klauzula ORDER BY jest zgodna z kolejno\u015bci\u0105 indeksu, oszcz\u0119dzam sobie sortowania i znacznie skracam ca\u0142kowity czas trwania operacji. W ten spos\u00f3b potwierdzam post\u0119py na podstawie zmierzonych warto\u015bci, a nie na podstawie niejasnych <strong>Wra\u017cenia<\/strong>.<\/p>\n\n<h2>Bezpieczna analiza instrukcji DML<\/h2>\n\n<p>W przypadku operacji UPDATE\/DELETE, kt\u00f3re zmieniaj\u0105 zawarto\u015b\u0107 bazy danych, post\u0119puj\u0119 w spos\u00f3b uporz\u0105dkowany:<\/p>\n<ul>\n  <li>Umieszczam pomiar w transakcji i cofam j\u0105, je\u015bli chc\u0119 tylko dokona\u0107 pomiaru.<\/li>\n  <li>Sprawdzam, czy wyzwalacze\/ograniczenia powoduj\u0105 dodatkowe koszty \u2013 polecenie EXPLAIN ANALYZE wskazuje wyd\u0142u\u017cony czas w odpowiednich w\u0119z\u0142ach.<\/li>\n  <li>Zwracam uwag\u0119 na stosunek \u201eaffected rows\u201c do \u201erows actual\u201c \u2013 niekorzystny stosunek wskazuje na zbyt p\u00f3\u017ane filtrowanie lub brak indeks\u00f3w.<\/li>\n<\/ul>\n<p>W przypadku instrukcji UPDATE obejmuj\u0105cych wiele tabel decyduj\u0105ce znaczenie maj\u0105 kolejno\u015b\u0107 po\u0142\u0105cze\u0144 (join) oraz pokrycie indeksowe. D\u0142ugi czas \u201etime to last row\u201c w w\u0119z\u0142ach sortowania\/\u0142\u0105czenia wskazuje na mo\u017cliwo\u015b\u0107 ulepszenia indeks\u00f3w lub przekszta\u0142cenia instrukcji w dwa ukierunkowane polecenia z buforowaniem.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/mysql_explain_analyze_8374.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Wp\u0142yw hostingu na wydajno\u015b\u0107 zapyta\u0144<\/h2>\n\n<p>Nie traktuj\u0119 bazy danych w oderwaniu od reszty, poniewa\u017c pami\u0119\u0107, operacje wej\u015bcia\/wyj\u015bcia i procesor maj\u0105 wp\u0142yw na ka\u017cd\u0105 <strong>Czas dzia\u0142ania<\/strong>. Szybkie dyski SSD skracaj\u0105 czas oczekiwania podczas odczytu, wystarczaj\u0105ca ilo\u015b\u0107 pami\u0119ci RAM zwi\u0119ksza pul\u0119 bufor\u00f3w, a solidny zestaw procesor\u00f3w przyspiesza sortowanie, agregacj\u0119 i <strong>Do\u0142\u0105cza<\/strong>. W \u015brodowiskach produkcyjnych preferuj\u0119 konfiguracje hostingowe, kt\u00f3re dobrze radz\u0105 sobie z obci\u0105\u017ceniami wymagaj\u0105cymi intensywnego przetwarzania danych. Przydatne informacje na temat optymalizacji dostarcza mi r\u00f3wnie\u017c <a href=\"https:\/\/webhosting.de\/pl\/wglad-w-dzialanie-wewnetrzne-optymalizatora-zapytan-mariadb-wglad-w-tuning-sql\/\">Wewn\u0119trzny optymalizator<\/a>, kt\u00f3re traktuj\u0119 jako dodatkow\u0105 perspektyw\u0119. \u0141\u0105cz\u0105c przemy\u015blany plan z silnym otoczeniem, osi\u0105gam wymierne korzy\u015bci w zakresie <strong>Czasy reakcji<\/strong>.<\/p>\n\n<h2>Zasoby i operatory w kontek\u015bcie<\/h2>\n\n<p>Podczas analizowania planu zwracam uwag\u0119 na w\u0119z\u0142y wymagaj\u0105ce du\u017cej ilo\u015bci pami\u0119ci. Du\u017ce operacje sortowania lub po\u0142\u0105czenia hashowe wymagaj\u0105 pami\u0119ci operacyjnej; je\u015bli s\u0105 zbyt du\u017ce, przechodz\u0105 do tabel tymczasowych. W drzewie TREE rozpoznaj\u0119 to po p\u00f3\u017anych, powolnych w\u0119z\u0142ach oraz wyra\u017anej r\u00f3\u017cnicy mi\u0119dzy \u201eczasem do pierwszego wiersza\u201c a \u201eczasem do ostatniego wiersza\u201c. Reaguj\u0119 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n  <li>Zmniejszenie ilo\u015bci danych wej\u015bciowych (wcze\u015bniejsze filtry, lepsze sterowniki po\u0142\u0105cze\u0144).<\/li>\n  <li>Ulepszona obs\u0142uga indeks\u00f3w w celu zapewnienia po\u017c\u0105danego porz\u0105dku i unikni\u0119cia powt\u00f3rze\u0144.<\/li>\n  <li>Sprawd\u017a, czy typ po\u0142\u0105czenia (p\u0119tla zagnie\u017cd\u017cona czy hash) jest dostosowany do ilo\u015bci danych.<\/li>\n<\/ul>\n<p>Szczeg\u00f3lnie w przypadku generowania raport\u00f3w uruchamiam EXPLAIN ANALYZE na reprezentatywnych danych, a nie na mini-migawkach. Tylko wtedy wyniki pomiar\u00f3w odzwierciedlaj\u0105 rzeczywiste obci\u0105\u017cenia.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/mysql-analyse-0912.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Najlepsze praktyki na co dzie\u0144<\/h2>\n\n<p>Najpierw analizuj\u0119 zapytania, kt\u00f3re rzucaj\u0105 si\u0119 w oczy w logach lub kt\u00f3re u\u017cytkownicy regularnie zg\u0142aszaj\u0105 jako dzia\u0142aj\u0105ce wolno <strong>zg\u0142osi\u0107<\/strong>. Nast\u0119pnie przeprowadzam pomiary za pomoc\u0105 polecenia EXPLAIN ANALYZE, dokumentuj\u0119 najwa\u017cniejsze dane liczbowe i por\u00f3wnuj\u0119 szacunki z rzeczywistymi wynikami. Na tej podstawie celowo modyfikuj\u0119 indeksy i konstrukcje zapyta\u0144, a tak\u017ce odnotowuj\u0119 wyniki przed i po zmianach, aby mo\u017cna by\u0142o prze\u015bledzi\u0107 post\u0119py <strong>marka<\/strong>. Planuj\u0119 te analizy na wczesnym etapie procesu rozwoju, zamiast czeka\u0107 na problemy produkcyjne. Dzi\u0119ki regularnym przegl\u0105dom szybciej dostrzegam wzorce i podejmuj\u0119 pewniejsze decyzje dotycz\u0105ce <strong>Strojenie<\/strong>-\u015arodki.<\/p>\n\n<h2>Praktyczna lista kontrolna pozwalaj\u0105ca na szybsze opracowywanie plan\u00f3w<\/h2>\n\n<ul>\n  <li>Warto\u015bci szacunkowe i rzeczywiste <strong>wiersze<\/strong> Czy wyniki s\u0105 z grubsza zgodne? Je\u015bli nie: sprawd\u017a statystyki\/histogramy.<\/li>\n  <li>Czy jaki\u015b w\u0119ze\u0142 dominuje pod wzgl\u0119dem \u201etime to last row\u201c? Pierwszy kandydat do optymalizacji (indeks, wyb\u00f3r po\u0142\u0105czenia, unikanie sortowania).<\/li>\n  <li>Czy liczba \u201ep\u0119tli\u201c jest bardzo du\u017ca? Nale\u017cy zoptymalizowa\u0107 sterownik po\u0142\u0105czenia\/indeks w tabeli wewn\u0119trznej lub zastosowa\u0107 po\u0142\u0105czenie typu semi-join.<\/li>\n  <li>Czy wyst\u0119puj\u0105 p\u00f3\u017aniejsze sortowania\/grupowania? Nale\u017cy dostosowa\u0107 kolejno\u015b\u0107 i kierunek indeksowania do klauzuli ORDER BY\/GROUP BY.<\/li>\n  <li>Czy zapytanie naprawd\u0119 wymaga wszystkich kolumn? Nale\u017cy d\u0105\u017cy\u0107 do utworzenia indeksu pokrywaj\u0105cego i upro\u015bci\u0107 list\u0119 SELECT.<\/li>\n  <li>Podzapytanie w ka\u017cdym wierszu? Przekszta\u0142ci\u0107 w JOIN lub zmaterializowa\u0107.<\/li>\n  <li>Stabilno\u015b\u0107 wzgl\u0119dem parametr\u00f3w? Nale\u017cy przeprowadzi\u0107 pomiary przy u\u017cyciu kilku realistycznych warto\u015bci.<\/li>\n<\/ul>\n\n<h2>Powszechne b\u0142\u0119dne interpretacje i jak ich unika\u0107<\/h2>\n\n<p>Nie polegam \u015blepo na szacunkach <strong>Koszty<\/strong>, je\u015bli rzeczywista liczba wierszy znacznie si\u0119 r\u00f3\u017cni. Nie wyci\u0105gam te\u017c pochopnych wniosk\u00f3w na podstawie \u201etime to first row\u201c, je\u015bli \u201etime to last row\u201c stanowi g\u0142\u00f3wne obci\u0105\u017cenie <strong>no\u015bniki<\/strong>. Szybki start niewiele daje, je\u015bli na ko\u0144cu dominuje sortowanie lub po\u0142\u0105czenie. Ponadto dok\u0142adnie sprawdzam p\u0119tle, poniewa\u017c cz\u0119sto kryj\u0105 one nieefektywne po\u0142\u0105czenie lub podzapyta\u0144, kt\u00f3re s\u0105 wykonywane dla ka\u017cdego wiersza. Dopiero gdy plan, wyniki pomiar\u00f3w i rozk\u0142ad danych s\u0105 ze sob\u0105 zgodne, wprowadzam zmiany <strong>Rzeczy<\/strong>.<\/p>\n\n<h2>Przypadki szczeg\u00f3lne: CTE, tabele pochodne, partycje<\/h2>\n\n<p>Wyra\u017cenia tablicowe (CTE) i tabele pochodne mog\u0105 by\u0107 materializowane lub scalane. W drzewie TREE postrzegam materializacj\u0119 jako oddzielny etap tworzenia. Jest to korzystne, gdy podstrumie\u0144 jest wykorzystywany wielokrotnie lub jego obliczenie jest kosztowne. Je\u015bli wyra\u017cenia CTE s\u0105 u\u017cywane tylko raz i maj\u0105 charakter selektywny, scalanie jest cz\u0119sto bardziej op\u0142acalne, poniewa\u017c eliminuje dodatkowe obci\u0105\u017cenie pami\u0119ci. Obserwuj\u0119, czy czas do pierwszego wiersza (time to first row) znacznie wzrasta \u2013 w takim przypadku materializacja mo\u017ce by\u0107 nadmierna.<\/p>\n<p>Tabele podzielone na partycje s\u0105 pomocne w przypadku du\u017cych zbior\u00f3w danych, gdy predykat wyra\u017anie ogranicza zakres partycji. Sprawdzam w planie, czy ma zastosowanie przycinanie (przeskanowanych zostanie tylko kilka partycji). Je\u015bli go brakuje, koszty rozk\u0142adaj\u0105 si\u0119 na wszystkie partycje \u2013 co wskazuje, \u017ce nale\u017cy dostosowa\u0107 klucze partycjonowania do najcz\u0119\u015bciej stosowanych filtr\u00f3w lub sformu\u0142owa\u0107 zapytanie w taki spos\u00f3b, aby mo\u017cliwe by\u0142o przycinanie.<\/p>\n\n<h2>Kr\u00f3tkie podsumowanie<\/h2>\n\n<p>Dzi\u0119ki poleceniu EXPLAIN ANALYZE uzyskuj\u0119 wymierne wyniki dotycz\u0105ce plan\u00f3w wykonawczych MySQL i identyfikuj\u0119 wra\u017cliwe punkty, kt\u00f3re nast\u0119pnie eliminuj\u0119 za pomoc\u0105 <strong>Wska\u017aniki<\/strong>, poprawi\u0119 sformu\u0142owanie zapytania i aktualne statystyki. Skupiam si\u0119 na rozbie\u017cno\u015bciach mi\u0119dzy szacowan\u0105 a rzeczywist\u0105 liczb\u0105 wierszy, czasach do pierwszego i ostatniego wiersza oraz na <strong>P\u0119tle<\/strong>. Na tej podstawie wyznaczam kilka skutecznych krok\u00f3w i ponownie sprawdzam ka\u017cdy efekt za pomoc\u0105 polecenia EXPLAIN ANALYZE. Z czasem natychmiast rozpoznaj\u0119 wzorce i szybciej wdra\u017cam odpowiednie dzia\u0142ania. W ten spos\u00f3b zwi\u0119kszam <strong>Wydajno\u015b\u0107<\/strong> s\u0105 niezawodne i zapewniaj\u0105 d\u0142ugoterminow\u0105 stabilno\u015b\u0107 zapyta\u0144.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dowiedz si\u0119, jak korzysta\u0107 z funkcji MySQL EXPLAIN ANALYZE, aby zrozumie\u0107 plany wykonania i skutecznie optymalizowa\u0107 zapytania SQL, korzystaj\u0105c ze s\u0142owa kluczowego \u201emysql explain analyze\u201d.<\/p>","protected":false},"author":1,"featured_media":21003,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[781],"tags":[],"class_list":["post-21010","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-datenbanken-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"116","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"mysql explain","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"21003","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/21010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/comments?post=21010"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/21010\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media\/21003"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media?parent=21010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/categories?post=21010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/tags?post=21010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}