Що це означає, коли MySQL перебуває у стані "Надсилання даних"?


163

Що це означає, якщо запит Mysql:

SHOW PROCESSLIST;

повертає "Надсилання даних" у стовпці "Держава"?

Я думаю, це означає, що запит виконано, і MySQL надсилає клієнту дані "результату", але мені цікаво, чому на це потрібно стільки часу (до години).

Дякую.


1
Це означає, що вона передає клієнту дані зі свого процесу. Якщо ви бачите Sending dataкрок, який потребує часу після запуску, SHOW PROFILEто витрачений час насправді належить до попереднього кроку.
NB

На жаль, я приймаю повідомлення, функція "ШОФ ПРОФІЛЮ" відключена, я повинен створити MySQL з "включенням-профілюванням". Але дякую за вашу відповідь.
користувач1345414

І це додаткове питання. Запит вже завершено внутрішньо, це питання ресурсів для передачі, як мережа чи шина?
користувач1345414

3
Ні, ви не слухаєте. Причина, яка Sending dataпоказує, що займає час, полягає в тому, що це помилка для профілювання MySQL, час, показаний там, належить до попереднього кроку, який має бути Executing queryчи щось подібне. Це просто означає, що ваш запит потребує часу для виконання. Sending dataкрок, як правило, швидкий, якщо ви не передаєте сотні мегабайт даних.
NB

3
Можливо, це питання може бути перейменовано на "Що означає стан" Надсилання даних "у MySQL". Простіше буде знайти питання.
антитоксичний

Відповіді:


249

Це досить оманливий статус. Це слід назвати "читання та фільтрація даних".

Це означає, що MySQLна диску (або в пам'яті) є деякі дані, які ще слід прочитати та надіслати. Це може бути сама таблиця, індекс, тимчасова таблиця, відсортований вихід тощо.

Якщо у вас є таблиця записів 1М (без індексу), з якої вам потрібна лише одна запис, MySQLвона все одно виводитиме статус як "надсилання даних" під час сканування таблиці, незважаючи на те, що вона ще нічого не надіслала.


12
Документація, яка додатково пояснює, що міркування, швидше за все, через те, що багато часу роблять доступ до диска: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Метью Колб

4
А що робити, якщо MySQL "надсилає дані" під час використання 99% процесора, з дуже маленьким введенням / виведенням диска?
rustyx

@RustyX Як щодо даних, які вже є в буфері в оперативній пам’яті, і вони сортують близько 100k або 1M рядків?
sjas

23

У такому стані:

Потік читає та обробляє рядки для оператора SELECT та надсилає дані клієнту.

Оскільки операції, що відбуваються під час цього стану, мають тенденцію до отримання великого обсягу доступу до диска (reads) .

Ось чому потрібно більше часу для завершення, і так це найдовший стан протягом життя певного запиту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.