Оптимизация работы Mysql
Как добиться снижения нагрузки на MySQL сервер?
Для начала надо убедиться, что использование MySQL-сервера в каждой конкретной задаче актуально. Например, создавать базу данных, чтобы хранить в ней тексты статей, картинки или бинарные файлы - неправильно. Для этого следует создавать обычные файлы, а в MySQL, при необходимости, хранить каталог (список) данных файлов. Как показывает практика, многие не понимают этого и создают базы данных во много раз превышающие размеры сайта и создающие колоссальные загрузки при поиске данных или обычной выборке. Также необходимо выбрать хороший платный хостинг сайту. На бесплатных хостингах действуют значительные ограничения на использование MySQL сервера.
Если Вы точно уверены, что использование MySQL в Вашем случае оправдано - тогда следует перейти к оптимизации запросов.
Прежде всего следует понимать, что наибольшая нагрузка создается при получении большого числа элементов из таблицы, поэтому основную часть задач следует перекладывать на PHP или Perl скрипты, не забывая создавать минимально требовательные запросы с максимальным количеством уточняющих условий. Например, Вам надо получить из таблицы элемент со значением параметра 'N' равным '5', для этого следует использовать запрос "SELECT * FROM table WHERE N=5;", а не использовать запрос "SELECT * FROM table;" и после этого в цикле сравнивать значения 'N'. SQL-запрос должен быть максимально чётким и узким, когда это позволяет специфика сайта.
Далее попробуем углубиться в анализирование запросов. В MySQL существует оператор EXPLAIN, он служит для получения информации о SELECT-запросе. Если оператору SELECT предшествует EXPLAIN, то MySQL сообщит о том, как будет производиться обработка SELECT, и предоставит информацию о порядке и методе связывания таблиц. При помощи EXPLAIN можно выяснить, когда стоит снабдить таблицы индексами, чтобы получить более быструю выборку, использующую индексы для поиска записей. Подробнее о работе и выводе команды EXPLAIN Вы можете прочитать по адресу - http://www.mysql.ru/docs/man/EXPLAIN.html. Используя EXPLAIN перед сложными запросами, охватывающими несколько таблиц, можно получить полную информацию об обработке запроса SELECT и, проанализировав данные, изменить таблицы для ускорения быстродействия. Подробно на примере оптимизация таблиц рассматривается по ссылке, приведенной выше.
Также следует обратить внимание на INSERT, UPDATE и DELETE запросы. Не смотря на относительную редкость (по сравнению с SELECT) их использования, они также могут создавать высокую нагрузку на сервер. Советуем ознакомиться с практическими советами по ускорению работы оператора INSERT - http://www.mysql.ru/docs/man/Insert_speed.html. UPDATE, по сути, включает в себя запрос SELECT и INSERT, поэтому к нему актуальны те же методы оптимизации. Запрос DELETE в оптимизации, как таковой, не нуждается, можно лишь отметить тот факт, что для очищения таблицы целиком следует использовать оператор TRUNCATE TABLE, так как уничтожение каждого элемента по отдельности займет много времени.
Не надо обходить стороной вопрос структуры самих таблиц. Например, следует избегать типов VARCHAR или BLOB для всех столбцов. При использовании единичного столбца VARCHAR или BLOB Вы получите динамическую длину строки.
Соблюдение простых правил по оптимизации запросов и таблиц MySQL может значительно сократить время загрузки страниц сайта. Для более тщательного изучения вопроса оптимизации MySQL советуем обратиться к официальной документации на русском языке - http://www.mysql.ru/docs/man/MySQL_Optimisation.html.