Для начала надо убедиться, что использование MySQL-сервера в каждой конкретной задаче актуально. Например, создавать базу данных, чтобы хранить в ней тексты статей, картинки или бинарные файлы - неправильно. Для этого следует создавать обычные файлы, а в MySQL, при необходимости, хранить каталог (список) данных файлов. Как показывает практика, многие не понимают этого и создают базы данных во много раз превышающие размеры сайта и создающие колоссальные загрузки при поиске данных или обычной выборке.
Если Вы точно уверены, что использование MySQL в Вашем случае оправдано - тогда следует перейти к оптимизации запросов. Прежде всего следует понимать, что наибольшая нагрузка создается при получении большого числа элементов из таблицы, поэтому основную часть задач следует перекладывать на PHP или Perl скрипты, не забывая создавать минимально требовательные запросы с максимальным количеством уточняющих условий. Например, Вам надо получить из таблицы элемент со значением параметра N равным 5, для этого следует использовать запрос «SЕLECT * FROM table WHERE N=5», а не использовать запрос «SЕLECT * FROM table» и после этого в цикле сравнивать значения N. SQL-запрос должен быть максимально чётким и узким, когда это позволяет специфика сайта.
Далее попробуем углубиться в анализирование запросов. В MySQL существует оператор EXPLAIN, он служит для получения получение информации о SЕLECT-запросе. Если оператору SЕLECT предшествует EXPLAIN, то MySQL сообщит о том, как будет производиться обработка SELECT, и предоставит информацию о порядке и методе связывания таблиц. При помощи EXPLAIN можно выяснить, когда стоит снабдить таблицы индексами, чтобы получить более быструю выборку, использующую индексы для поиска записей. Используя EXPLAIN перед сложными запросами, охватывающими несколько таблиц, можно получить полную информацию об обработке запроса SЕLECT и, проанализировав данные, изменить таблицы для ускорения быстродействия. Подробно на примере оптимизация таблиц рассматривается по ссылке, приведенной выше.
Также следует обратить внимание на INSERT, UPDATE и DELETE запросы. Не смотря на относительную редкость (по сравнению с SELECT) их использования, они также могут создавать высокую нагрузку на сервер. UPDATE, по сути, включает в себя запрос SЕLECT и INSERT, поэтому к нему актуальны те же методы оптимизации. Запрос DELETE в оптимизации, как таковой, не нуждается, можно лишь отметить тот факт, что для очищения таблицы целиком следует использовать оператор TRUNCATE TABLE, так как уничтожение каждого элемента по отдельности займет много времени.