|
|
|
Задача - блоги:френдлента
|
|||
|---|---|---|---|
|
#18+
Стандартная задача про френдленту. Блоги-посты-пользователи-друзья. Делаю на MySQL Не могу придумать способ эффективного решения задачи. В двух словах задача описывается как "выбрать все посты созданные кем-либо из указанной группы и отсортированные в порядке убывания даты создания". Непонятно даже какой индекс завести. Пока делаю "в лоб" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Внутренний подзапрос эффективно использует индекс (member_id_source, member_id_target) - но все остальное работает не эффективно - использует временные таблицы и сортировку. Второй вариант запроса был - сканировать вообще всю таблицу постов в порядке убывания даты создания (используется индекс) и отбирать посты, пользователь которых является нашим другом (выборку делать заранее независимым подзапросом) пока не наберется нужное количество (заданное через OFFSET/LIMIT) - но тут тоже засада, что если наши друзья давно ничего не писали - мы пройдемся сканом по всей таблице. Третий вариант предполагает при создании поста - смотреть кто наш друг и заносить для всех друзей анонс этого поста в специальную отдельную таблицу "френдленты" - вариант позволяющий завести хороший индекс "пользователь, время-создания-поста-друга" и обеспечивающий быстрые запросы "выбрать все идентификаторы постов моих друзей в порядке убывания даты создания" - но его обслуживание достаточно сложное - при заведении дружбы с пользователем его прежние посты будут недоступны во френдленте. В общем, буду рад выслушать любые идеи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 11:54 |
|
||
|
Задача - блоги:френдлента
|
|||
|---|---|---|---|
|
#18+
План Код: plaintext 1. 2. 3. XXX = idx_posts_member,idx_posts_created_access,idx_posts_popularity_access,idx_posts_created_typed_access,idx_posts_popularity_typed_access То есть вроде запрос сам правильный, но первоначальная концепция хромает - выбираются все посты каждого из друзей и только потом все вместе сортируются - хочется большей эффективности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 12:04 |
|
||
|
Задача - блоги:френдлента
|
|||
|---|---|---|---|
|
#18+
Nick Mazurkinно тут тоже засада, что если наши друзья давно ничего не писали - мы пройдемся сканом по всей таблице. Можно ограничить по дате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2009, 13:25 |
|
||
|
Задача - блоги:френдлента
|
|||
|---|---|---|---|
|
#18+
Nick MazurkinВ общем, буду рад выслушать любые идеи Cходу... пожалуй, пока неизвестна нагрузка, я бы сделал индекс на дата+ид_человека и выбирал бы по условию дата > (последний заход минус неделя), ид_человека в друзьях. Когда и если станет тормозить - повесил бы триггера, поддерживающие список в момент сохранения поста. Думаю, этого хватило бы, и написать обновление списка при нескольких операциях (добавление-удаление друга, добавление-удаление-модификация поста) нетрудно. Если вдруг и тормоза при отправке поста станут критичны - убрать триггера и ставить флаг, по которому сработает фоновый процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2009, 13:33 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36017581&tid=1543217]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
180ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 500ms |

| 0 / 0 |
