Недавно (недели две назад) ко мне обратились с просьбой решить проблему с «медленными запросами» на форуме phpBB второй версии. Хостер (1Gb.ru) предоставил проблемные запросы, и я, особо не задумываясь, просто закомментировал их вызовы, тем более что уже была готовая наработка (mod).
На этих выходных опять пришло предупреждение от хостера, в этот раз я решил подойти к делу более основательно. Внимательно просмотрел запрос, обратил внимание на наличие индексов по запрашиваемым полям, некоторое сомнение вызывало наличие в запросе IN с большим списком ID, но, прочитав документацию по MySQL, убедился, что такие запросы при наличии индекса без проблем оптимизуются сервером. Спросил тех. поддержку хостера, с чем может быть это связано, получил потрясающий ответ, что IN вообще не подлежит оптимизации. Я подобные вещи ещё вручную делал на Клиппере с dbf базами.

При помощи команды EXPLAIN посмотрел потребляемые запросом ресурсы — действительно, по какой-то причине сервер просматривал большое количество строк, и использовались tmp (временные таблицы) для filesort. Начал гуглить, из-за чего такое возможно, и в одном месте наткнулся, что кому-то помогла SQL команда ANALYZE TABLE. Попробовал проделать данную операцию со всеми таблицами, участвующими в запросе, и действительно, проблемный запрос стал оптимизироваться, как ему и положено.

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

5 комментариев на запись “«Медленные запросы» в MySQL”

  1. Горбунов Олег (#kid) пишет:

    Если таблицы изменялись каким либо модом, или вручную, затрагивая индексированные поля, индексы по этим полям автоматически перестроены не будут. Необходимо либо пересоздать индекс, либо перестроить его командой OPTIMIZE TABLE. Соот-сно, при ANALYSE TABLE тоже выполняется оптимизация.

  2. nurlan пишет:

    Про такое не слышал. В любом случае сделать OPTIMIZE и ANALYZE TABLE всегда полезно и лишним не будет.

  3. Горбунов Олег (#kid) пишет:

    > OPTIMIZE и ANALYZE TABLE всегда полезно и лишним не будет.

    Это точно. ;)

  4. налогоплательщик пишет:

    Так вроде в PHPMyAdmin есть оптимизатор таблиц. Применив оптимизацию на больших страницах можно выиграть во времени. Ну и конечно индексы таблиц.
    Также нужно проверять чтобы таблицы не были битыми. Битые таблицы тормозят запросы

  5. nurlan пишет:

    так phpmyadmin как раз и вызывает эти команды :)

Оставить комментарий