Was bedeutet es, wenn sich MySQL im Status "Daten senden" befindet?

163

Was bedeutet es, wenn die MySQL-Abfrage:

SHOW PROCESSLIST;

gibt "Daten senden" in der Spalte "Status" zurück?

Ich kann mir vorstellen, dass dies bedeutet, dass die Abfrage ausgeführt wurde und MySQL "Ergebnis" -Daten an den Client sendet, aber ich frage mich, warum dies so lange dauert (bis zu einer Stunde).

Danke dir.

user1345414
quelle
1
Dies bedeutet, dass Daten von seinem Prozess an den Client übertragen werden. Wenn Sie Sending dataeinen Schritt sehen, der nach dem Ausführen einige SHOW PROFILEZeit in Anspruch nimmt, gehört die verbrauchte Zeit tatsächlich zum vorherigen Schritt.
NB
Leider nehme ich eine Nachricht entgegen: Die Funktion "PROFIL ANZEIGEN" ist deaktiviert. Ich muss MySQL mit "Profilerstellung aktivieren" erstellen. Aber danke für Ihre Antwort.
user1345414
Und es ist eine zusätzliche Frage. Die Abfrage wurde bereits intern abgeschlossen. Handelt es sich um Ressourcen für die Übertragung wie Netzwerk oder Bus?
user1345414
3
Nein, Sie hören nicht zu. Der Grund, der sich Sending dataals zeitaufwändig herausstellt, ist, dass es sich um einen MySQL-Profilierungsfehler handelt. Die dort angezeigte Zeit gehört zum vorherigen Schritt, der sein sollte Executing queryoder etwas Ähnliches. Es bedeutet nur, dass die Ausführung Ihrer Abfrage einige Zeit in Anspruch nimmt. Sending dataDer Schritt ist normalerweise schnell, es sei denn, Sie streamen Hunderte von Megabyte Daten.
NB
3
Vielleicht könnte diese Frage in "Was bedeutet der Status" Daten senden "in MySQL bedeutet" umbenannt werden. Es wird einfacher sein, die Frage zu finden.
Antitoxikum

Antworten:

249

Dies ist ein ziemlich irreführender Status. Es sollte als "Lesen und Filtern von Daten" bezeichnet werden.

Dies bedeutet, dass MySQLeinige Daten auf der Festplatte (oder im Speicher) gespeichert sind, die noch gelesen und gesendet werden müssen. Dies kann die Tabelle selbst, ein Index, eine temporäre Tabelle, eine sortierte Ausgabe usw. sein.

Wenn Sie eine 1M-Datensatztabelle (ohne Index) haben, von der Sie nur einen Datensatz benötigen, MySQLwird beim Scannen der Tabelle weiterhin der Status "Daten senden" ausgegeben, obwohl noch nichts gesendet wurde.

Quassnoi
quelle
12
Die Dokumentation, die weiter erklärt, dass die Argumentation höchstwahrscheinlich auf viel Zeit beim Festplattenzugriff zurückzuführen ist: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Matthew Kolb
4
Und was ist, wenn MySQL "Daten sendet", während 99% der CPU mit sehr wenig Festplatten-E / A verwendet werden?
Rustyx
@RustyX Wie wäre es, wenn die Daten bereits im Puffer im RAM vorhanden sind und etwa 100 KB oder 1 MB Zeilen sortieren?
Sjas
23

In diesem Staat:

Der Thread liest und verarbeitet Zeilen für eine SELECT-Anweisung und sendet Daten an den Client.

Da Operationen, die während dieses Zustands ausgeführt werden, dazu neigen, große Mengen an Festplattenzugriff (Lesevorgänge) auszuführen .

Aus diesem Grund dauert der Abschluss länger und der am längsten laufende Status über die Lebensdauer einer bestimmten Abfrage.

Venkatesh Kalikiri
quelle