Co to znaczy, gdy MySQL jest w stanie „Wysyłanie danych”?

163

Co to znaczy, jeśli kwerenda MySQL:

SHOW PROCESSLIST;

zwraca „Wysyłanie danych” w kolumnie Stan?

Wyobrażam sobie, że oznacza to, że zapytanie zostało wykonane i MySQL wysyła dane „wynikowe” do klienta, ale zastanawiam się, dlaczego zajmuje to tak dużo czasu (do godziny).

Dziękuję Ci.

user1345414
źródło
1
Oznacza to, że przesyła dane ze swojego procesu do klienta. Jeśli widzisz Sending datakrok, który zajmuje trochę czasu po uruchomieniu, SHOW PROFILEto czas spędzony w rzeczywistości należy do kroku wcześniejszego.
Uwaga:
Niestety odbieram komunikat, funkcja 'POKAŻ PROFIL' jest wyłączona, muszę zbudować MySQL z 'włączaniem profilowania' Ale dziękuję za twoją odpowiedź.
user1345414
I to jest dodatkowe pytanie. Zapytanie zostało już zakończone wewnętrznie, czy jest to kwestia zasobów do transmisji, takich jak sieć lub autobus?
user1345414
3
Nie, nie słuchasz ... powodem, dla którego Sending datapokazuje się, że zajmuje to czas, jest to, że jest to błąd profilowania MySQL, czas pokazany tam należy do kroku wcześniej, który powinien być Executing querylub coś podobnego. Oznacza to po prostu, że wykonanie zapytania zajmuje trochę czasu. Sending datakrok jest zwykle szybki, chyba że przesyłasz strumieniowo setki megabajtów danych.
Uwaga:
3
Być może można zmienić nazwę tego pytania na „Co oznacza stan„ Wysyłanie danych ”w MySQL”. Łatwiej będzie znaleźć pytanie.
antytoksyczny

Odpowiedzi:

249

To jest dość mylący status. Powinien nazywać się „odczyt i filtrowanie danych”.

To znaczy że MySQL niektóre dane są przechowywane na dysku (lub w pamięci), które nie zostały jeszcze odczytane i przesłane. Może to być sama tabela, indeks, tabela tymczasowa, posortowane dane wyjściowe itp.

Jeśli masz tabelę 1M rekordów (bez indeksu), do której potrzebujesz tylko jednego rekordu, MySQLpodczas skanowania tabeli nadal będzie wyświetlał status „wysyłanie danych”, mimo że jeszcze nic nie wysłała.

Quassnoi
źródło
12
Dokumentacja, która dalej wyjaśnia, że ​​rozumowanie jest najprawdopodobniej spowodowane dużą ilością czasu na dostęp do dysku: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Matthew Kolb,
4
A co, jeśli MySQL „wysyła dane”, wykorzystując 99% procesora i bardzo mało operacji we / wy dysku?
rustyx
@RustyX A co z danymi, które są już obecne w buforze w pamięci RAM i sortuje około 100 tys. Lub 1 mln wierszy?
sjas
23

W tym stanie:

Wątek odczytuje i przetwarza wiersze instrukcji SELECT oraz wysyła dane do klienta.

Ponieważ operacje występujące w tym stanie mają tendencję do wykonywania dużych ilości dostępu do dysku (odczytów) .

Dlatego ukończenie zajmuje więcej czasu, podobnie jak najdłużej działający stan w całym okresie istnienia danego zapytania.

Venkatesh Kalikiri
źródło