Выборка больших данных из базы сложными запросами?
Есть проект php/mysql. В системе есть моменты когда нужно делать достаточно сложные и большие запросы, с большой выборкой.
Запросы могут содержать больше 5 джойнов (иногда из одной и той же таблицы, которая работает как meta таблица с ключами и значениями), а также UNION select и так далее.
Когда нужно сделать выборку с 20к-25к записей, то это берет около 15 секунд, что в принципе не нормально.
Какие техники для оптимизации здесь можно использовать?
Какие варианты есть?
Может быть: Кеширование? Пагинация (добавляет проблем)?
EXPLAIN запроса, индексы. Иногда помогает замена JOIN на под запрос без зависимостей по данным (если результат база данных сама может закешировать). Так же если у вас проблемы с джойнами - спасают вьюшки.
@redc0de: хм... а если все же у разработчика кривая архитектура, кучи ненужных left join, нету индексов, всюду filesort отрабатывает... Так же может быть вполне что СУБД не сконфигурирована должным образом (размеры буферов и кеша занижены).
20К-25К записей с джойнами это не сильно то и сложная выборка. Но если на серваке не хватает оперативки и создается темповая таблица - то да, будут жесткие лаги. EXPLAIN вам все расскажет.