parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Оптимизация запроса, структуры базы или еще чего

nkostya 28.05.2010 21:15

Здравствуйте. Нужна ваша подсказка в оптимизации запроса или советы по изменению структуры БД. Прошу прощения, что написал в этот форум, но тут много умных людей, надеюсь на вашу помощь.

Задача: есть таблица с пользователями, их дружбой, есть сообщения. Нужно вывести пользователю с user_id 30 последних сообщений, которые соответствуют схеме: его сообщения, все сообщения его друзей которые написаны сами по себе (parent_message_id = 0) и сообщения друзей, написанные вашим взаимным друзьям.
user: user_id, name...
friendship: friendship_id, user_id, friend_user_id...
message: message_id, parent_message_id, user_id, op_user_id
parent_message_id - id родительского сообщения
op_user_id - id пользователя в ответ на которое написано данное сообщение

Мой вариант решения был такой:

1. Получаем моих друзей (user_friends)
SELECT * FROM message
		JOIN
			user ON (user.user_id = message.user_id)
		LEFT JOIN
			user AS op_user ON (op_user.user_id = message.op_user_id)
WHERE
		user_id = $self.user_id
		^if($user_friends){OR (user_id IN (^foreach[$user_friends;f]{$f.friend_user_id}[,]) AND op_user_id IN (0, $self.user_id ^foreach[$user_friends;f]{, $f.friend_user_id}))}
Да, OR использовать в выражении плохо. Можно заменить на 2 запроса SELECT через JOIN.

Но вот что делать с большим кол-вом user_friends. Т.к. кол-во дружб может быть и 50000 (что уже есть).

Подскажите вариант по оптимизации, очень нужен совет.