Любой джоин можно заменить на два запроса :)
Sumo 27.10.2013 17:50
Что касается остального, то не понимая логики работы приложения и не увидев данные давать какие-то конкретные рекомендации невозможно.
Я бы оптимизировал следующим образом:
— Находим те запросы, которые «тормозят». Обычно их немного. Если «тормозит все», то либо плохо настроена СУБД и ОС или схема базы данных сделана неверно.
— Если в плохих запросах используется табличка с большим объемом данных или в нее идет много инсертов, то имеет смысл разбить ее на кусочки (партишионинг, шардинг).
— Смотрим, не тормозят ли джоины. Иногда это бывает, особенно если есть outer-джоины (left, right) да еще по нескольким таблицам. В этом случае разбиваем запрос: достаем записи из связаных таблицам по ключам и объединяем в программе (для этого лучше доставать таблички в парсеровские хеши).
— Статистические запросы (с группировками и фильтрами) как правило можно рассчитывать асинхронно и класть в отдельную табличку. Если есть репликация, то делать это можно на наименее загруженной реплике.
— Часто можно убрать джоины, если он делается через вторую табличку только для того, чтобы получить айдишник из третьей. В данном случае айдишник из третьей можно добавить в первую и вообще избавится от джоинов.
— Если у нас есть дерево, то можно в каждом узле добавить поле с путем от корня (айдишники через запятую).
Еще раз повторю, все это сильно зависит от приложения, поэтому каких-то универсальных приемов оптимизации не бывает.