«Медленные запросы» в MySQL
29.01.2008
Недавно (недели две назад) ко мне обратились с просьбой решить проблему с «медленными запросами» на форуме phpBB второй версии. Хостер (1Gb.ru) предоставил проблемные запросы, и я, особо не задумываясь, просто закомментировал их вызовы, тем более что уже была готовая наработка (mod).
На этих выходных опять пришло предупреждение от хостера, в этот раз я решил подойти к делу более основательно. Внимательно просмотрел запрос, обратил внимание на наличие индексов по запрашиваемым полям, некоторое сомнение вызывало наличие в запросе IN с большим списком ID, но, прочитав документацию по MySQL, убедился, что такие запросы при наличии индекса без проблем оптимизуются сервером. Спросил тех. поддержку хостера, с чем может быть это связано, получил потрясающий ответ, что IN вообще не подлежит оптимизации. Я подобные вещи ещё вручную делал на Клиппере с dbf базами.
При помощи команды EXPLAIN посмотрел потребляемые запросом ресурсы — действительно, по какой-то причине сервер просматривал большое количество строк, и использовались tmp (временные таблицы) для filesort. Начал гуглить, из-за чего такое возможно, и в одном месте наткнулся, что кому-то помогла SQL команда ANALYZE TABLE. Попробовал проделать данную операцию со всеми таблицами, участвующими в запросе, и действительно, проблемный запрос стал оптимизироваться, как ему и положено.
Отписал хостеру. Думаю, что они сделали оптимизацию индексов на SQL сервере, поскольку у другого обратившегося с подобной проблемой человека я её уже просто не обнаружил.
29.01.2008 в 19:37
Если таблицы изменялись каким либо модом, или вручную, затрагивая индексированные поля, индексы по этим полям автоматически перестроены не будут. Необходимо либо пересоздать индекс, либо перестроить его командой OPTIMIZE TABLE. Соот-сно, при ANALYSE TABLE тоже выполняется оптимизация.
29.01.2008 в 21:12
Про такое не слышал. В любом случае сделать OPTIMIZE и ANALYZE TABLE всегда полезно и лишним не будет.
29.01.2008 в 21:19
> OPTIMIZE и ANALYZE TABLE всегда полезно и лишним не будет.
Это точно. ;)
03.04.2008 в 14:14
Так вроде в PHPMyAdmin есть оптимизатор таблиц. Применив оптимизацию на больших страницах можно выиграть во времени. Ну и конечно индексы таблиц.
Также нужно проверять чтобы таблицы не были битыми. Битые таблицы тормозят запросы
03.04.2008 в 14:44
так phpmyadmin как раз и вызывает эти команды :)