Русскоязычный форум, посвященный фреймворку Kohana http://forum.kohanaframework.su/ |
|
Оптимизация. Вывод списка пользователей и ролей. http://forum.kohanaframework.su/viewtopic.php?f=32&t=774 |
Страница 1 из 1 |
Автор: | AmberLEX [ 28 ноя 2013, 03:17 ] |
Заголовок сообщения: | Оптимизация. Вывод списка пользователей и ролей. |
Есть простой пример: вывести список пользователей и список их ролей Код:
Ну вот собственно запросы т.е. на 5 пользователей 7 запросов (1 для подсчета, 1 для выборки пользователей, остальные - выборка ролей для каждого пользователя) Как это можно оптимизировать или кешировать? Вариант Код:
Код:
Вариант Код:
Но и этот и предыдущий, создают 5 папок в кеше на каждого пользователя - это ерунда какаято выходит, явно не оно. |
Автор: | WinterSilence [ 28 ноя 2013, 13:05 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
в любом случае нужно дописать метод для получения такого списка. вариант 1 1 запрос: получение списка пользователей 2 запрос: получение списка ролей на основании запроса 1 ну и потом когда циклом будешь пользователей выводить подциклом их роли(попутно удаляя отработанные значения, чтобы сократить в следующий подцикл) вариант 2: 1 запрос: выбираешь список ролей (на тот маловероятный случай, когда какие-то роли не используются можно добавить проверку на связь ролей с таблицей users_roles) 2 запрос: выбираешь список пользователей, подзапросом выбираешь их роли и объединяешь их в строку(с разделителем ';' например) Циклом выводишь пользователей, explode колонки с ролями пользователей и с помощью массива из запроса 1 выводишь их. Можно конечно и 1 запросом этот вариант реализовать, но так придется больший объем данных передавать, а мне это кажется более медленным, хотя честно говоря не тестил. вариант 3 кешировать надо Model_User целиком, ну и в зависимости от параметров сохранять под определенной меткой например model:user:list:0:50 где 0 это offset, а 50 Limit. по поводу места, дискового пространства обычно хоть жопой жуй, а вот процессорная нагрузка строго лимитирована т.ч. за размер кеша можно особо не переживать - окупится. |
Автор: | AmberLEX [ 28 ноя 2013, 13:59 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
Цитата: в любом случае нужно дописать метод для получения такого списка. Так есть вроде метод: $user->get_roles()Странно, неужели никто не решал подобную задачу? Вроде довольно стандартная. Например требуется вывести список записей блога. К каждой записи из списка вывести: -- список тегов -- список категорий На страницу из 15 записей будет 32 запроса (1 для подсчета, 1 для выборки; и в цикле: 15 для тегов и 15 категорий) Задачу получилось решить вообще двумя запросами, только не знаю насколько это нормально будет. Примерно так Код:
Потом уже в шаблоне Код:
Два запроса, 15 записей (хоть 100) на странице Только в случае блога, для тегов и категорий в запросе будет уже 4 GROUP_CONCAT Думаю построить нужный массив быстрее, чем куча запросов? Как думаете? |
Автор: | WinterSilence [ 28 ноя 2013, 16:36 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
Цитата: Странно, неужели никто не решал подобную задачу? Вроде довольно стандартная. а толку? ты все равно сделал по своему. в варианте 2 я написал почему твой вариант менее удачен. Цитата: Думаю построить нужный массив быстрее, чем куча запросов? Как думаете? быстрее думаю(но простестить не мешает), только зачем тебе для вывода хэлпер, причем такой кривой? сделай парсинг прямо во вьюхе и все. |
Автор: | AmberLEX [ 29 ноя 2013, 10:50 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
Цитата: а толку? ты все равно сделал по своему Вариант 1 я не понялЦитата: только зачем тебе для вывода хэлпер, причем такой кривой? Чем кривой? Может так:Код:
|
Автор: | WinterSilence [ 29 ноя 2013, 13:38 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
Цитата: Вариант 1 я не понял вариант 1 1 запрос: получение списка пользователей SELECT * FROM users LIMIT 0, 10 2 запрос: получение списка ролей на основании запроса 1 SELECT roles.id, roles.name, users_roles.id AS user_id FROM users_roles LEFT JOIN roles ON roles.id = users_roles.role_id WHERE users_roles.id IN (список id пользователей из запроса 1) так понятно? Цитата: Чем кривой? названием метода, названием переменных, кривыми ссылками. второй вариант еще хуже. смысл писать метод который используется только в одном месте? ведь этот класс будет постоянно в памяти болтаться. |
Автор: | AmberLEX [ 29 ноя 2013, 15:15 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
Цитата: названием метода, названием переменных, кривыми ссылками. Думал кривой код в смысле алгоритма или неоптимизации. Вообще я про запросы речь вел и чтобы быстрее понять суть, а не вникать во вспомогательный код, укоротил его для примера. У меня с небольшими изменениями (заменил $str на ob_start и перенёс Arr::combine в foreach) он выглядит так Код:
Чтобы не висел в памяти можно перенести во вьюху (здесь тоже больше всего, чем в примере) Код:
Пример 1 понял, попробую, спасибо. |
Автор: | WinterSilence [ 29 ноя 2013, 15:40 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
не очень понимаю зачем эти пляски с бубном вокруг буфера обмена? по моему это более ресурсоемкий вариант по сравнению с первоначальным. функция продолжит висеть в памяти после выполнения вьюхи если так хочется функцией то тогда используй замыкание. во вьюху можно добавить кеширование через Fragment |
Автор: | AmberLEX [ 29 ноя 2013, 17:04 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
Это так что-ли? Код:
И не очень понимаю такую экономию. ORM вообще тащит все поля таблицы, хотя мне нужны всего несколько и в чем смысл экономить на функции? |
Автор: | WinterSilence [ 29 ноя 2013, 17:31 ] |
Заголовок сообщения: | Re: Оптимизация. Вывод списка пользователей и ролей. |
ага так, только обычно объявление классов и функций идет до их вызова. если оптимизировать, то все. а то ты оптимизируя запросы наплодил кучу новых проблем. |
Страница 1 из 1 | Часовой пояс: UTC + 4 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |