Есть довольно крупный проект на Kohana3. ORM используется
Jam. Но это не столь важно.
На сайте имеются различные списки с фильтрациями-пагинациями, для генерации которых требуются 5 и более ассоциаций с другими таблицами (все настроено на уровне ORM). Все это дело очень удобно сделано и хорошо работает средствами CMF. Естественно, списки получаются чем-то вроде findAll(), потом результат в цикле перебирается, в цикле же происходят обращения к ассоциациям и генерация каждого элемента списка. Благодаря lazy load в итоге получаем по запросу на каждое обращение к данным. И в конечном итоге вместо одного большого запроса имеем сотни мелких, что по скорости генерации страницы гораздо медленнее.
Вообще, похоже, что такие сложные запросы (с ассоциациями) выполнить средствами ORM в один запрос невозможно. Поправьте, если ошибаюсь. Можно пример на других ORM, все равно, думаю, что они примерно одинаково все работают.
Так вот, остро стоит вопрос об оптимизации скорости генерации страницы. Я вижу несколько путей решения:
1) Писать руками большие и толстые SQL-запросы. Плюсы: они будут быстрее выполняться; меньше нагрузка на БД. Минусы: это будет занимать много времени, т.к. я не очень хорошо знаю SQL; это плохо выглядит в коде; это не очень удобно при наличии фильтрации и пагинации.
2) Использовать Redis. Плюсы: опять же, это быстро; нагрузки на БД почти нет; есть множества, которые можно объединять для использования при фильтрации; вроде как множества можно использовать и для пагинации. Минусы: про redis я только слышал/читал; надо понимать, как обновлять в нем данные при обновлении БД, а обновляться она будет часто.
3) Тупо кешировать (Memcache) все списки, включая все фильтры и страницы. Но это как-то слишком в лоб.
Какой подход наиболее оптимален в плане трудозатраты/результат? Может быть, еще есть какой-то вариант?
P.S.: мне лично больше приглянулся вариант 2. В связи с этим вопрос, если со мной кто-то согласится: как лучше реализовывать пагинацию? Каждую страницу отдельно хранить, или получать по частям из общего списка объектов? Извините, если вопрос не корректен, повторюсь, Redis я никогда не трогал.