Что это значит, когда MySQL находится в состоянии «Отправка данных»?

163

Что это значит, если запрос Mysql:

SHOW PROCESSLIST;

возвращает «Отправка данных» в столбце «Состояние»?

Я предполагаю, что это означает, что запрос был выполнен, и MySQL отправляет данные «результата» клиенту, но мне интересно, почему это занимает так много времени (до часа).

Спасибо.

user1345414
источник
1
Это означает, что он передает данные от своего процесса клиенту. Если вы рассматриваете Sending dataкак шаг, который требует времени после запуска, SHOW PROFILEто затраченное время фактически относится к предыдущему шагу.
NB
К сожалению, я получаю сообщение: функция 'SHOW PROFILE' отключена, мне нужно собрать MySQL с помощью 'enable-profiling'. Но спасибо за ваш ответ.
user1345414
И это дополнительный вопрос. Запрос уже завершен внутри, это вопрос ресурсов для передачи, таких как сеть или шина?
user1345414
3
Нет, вы не слушаете ... причина, по которой это Sending dataзанимает время, заключается в том, что это ошибка профилирования MySQL, показанное время относится к предыдущему шагу, который должен быть Executing queryили что-то подобное. Это просто означает, что ваш запрос требует времени для выполнения. Sending dataшаг обычно быстрый, если вы не передаете сотни мегабайт данных.
NB
3
Возможно, этот вопрос можно переименовать в «Что означает состояние« Отправка данных »в MySQL». Будет проще найти вопрос.
антитоксический

Ответы:

249

Это довольно вводящий в заблуждение статус. Это должно называться «чтение и фильтрация данных».

Это означает, что MySQLна диске (или в памяти) хранятся некоторые данные, которые еще предстоит прочитать и переслать. Это может быть сама таблица, индекс, временная таблица, отсортированный вывод и т. Д.

Если у вас есть таблица записей 1M (без индекса), для которой вам нужна только одна запись, MySQLвы все равно будете выводить статус «отправка данных» во время сканирования таблицы, несмотря на то, что она еще ничего не отправила.

Quassnoi
источник
12
Документация, которая дополнительно объясняет, что рассуждения наиболее вероятны из-за большого количества времени, обращающегося к диску: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Мэтью Колб
4
А что если MySQL «отправляет данные», используя 99% ЦП, с очень небольшим дисковым вводом-выводом?
rustyx
@RustyX Как насчет того, чтобы данные уже присутствовали в буфере в оперативной памяти и сортировали порядка 100 тыс. Или 1 млн. Строк?
sjas
23

В этом состоянии:

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

Поскольку операции, происходящие во время этого состояния, имеют тенденцию выполнять большие объемы доступа к диску (чтение) .

Вот почему для его завершения требуется больше времени, и поэтому он длится дольше всего в течение времени существования данного запроса.

Венкатеш Каликири
источник