Назад | Перейти на главную страницу

Оценка времени выполнения запросов MySQL

Я выполнил запрос MySQL из командной строки, используя следующее:

nohup mysql --user=root --password=XXXXXXXXX database < report.sql > results.tab

Этот запрос является обширным (5000 строк) и выполняет сложный поиск по 90 000 000 строк из 150 таблиц.

Этот запрос выполняется более 24 часов и еще не завершен.

Есть ли способ запустить проверку статуса для этого запущенного запроса?

Что ж, вы можете войти в консоль mysql и выдать SHOW PROCESSLIST; команда. Это покажет вам, какие запросы выполняются, но вы не получите оценку, когда эти запросы закончатся.

Если вы запускаете запросы с EXPLAIN EXTENDED префикс заранее, который покажет вам количество элементов и другие важные детали запроса. Это может вам помочь, но, поскольку запрос выполняется, вы можете использовать другой подход, подробно описанный на странице mysqlperformanceblog.

Отрывок:

Ответ был прост, потому что на сервере больше ничего не работало. Это означает, что SHOW GLOBAL STATUS дает приблизительное представление о том, что на самом деле делает запрос. (Если бы на сервере была большая активность, я бы не смог с уверенностью сказать, что SHOW GLOBAL STATUS показывает, что делает этот один запрос; активность других запросов тоже была бы смешанной. Было бы здорово иметь возможность выбрать другой поток и наблюдать только за его статусом, но MySQL в настоящее время не позволяет вам этого делать.)

Решением было измерить, насколько быстро запрос сканирует строки при сканировании таблицы фактов. Это показано переменной состояния Handler_read_rnd_next. Вот простой способ его посмотреть (innotop - еще один удобный способ):

mysqladmin extended -r -i 10 | grep Handler_read_rnd_next
-- ignore the first line of output...
| Handler_read_rnd_next             | 429224      |

Таким образом, сервер считывал примерно 43 КБ строк в секунду, а в таблице было 150 миллионов строк. Немного математики позже, и вы получите 3488 секунд до завершения, или чуть меньше часа. И действительно, запрос был выполнен примерно за 55 минут.

Это простейший случай, и есть более сложные, которые следует рассмотреть, но, надеюсь, это даст вам представление о том, как вы можете решить эту проблему в различных ситуациях.

Похоже, что оценить ход выполнения запроса - непростая задача. Вы можете посмотреть на эта почта.

Другие варианты, которые я могу выделить:

  1. Вы можете использовать системный инструмент, например top чтобы убедиться, что он все еще работает (потребляет ресурсы процессора).
  2. По возможности рекомендуется разделить сложный запрос на несколько запросов. В этом случае вы можете просто написать сценарий для выполнения нескольких запросов и отображения некоторой информации между каждыми двумя последовательными выполнениями. Таким образом вы сможете узнать, как продвигается работа.