Hi stackoverflow (Мой первый вопрос!),
Мы делаем что-то вроде SNS и получили вопрос об оптимизации запросов.
Используя mysql 5.1, была создана текущая таблицас помощью:
CREATE TABLE friends(
user_id BIGINT NOT NULL,
friend_id BIGINT NOT NULL,
PRIMARY KEY (user_id, friend_id)
) ENGINE INNODB;
Образцы данных заполняются следующим образом:
INSERT INTO friends VALUES
(1,2),
(1,3),
(1,4),
(1,5),
(2,1),
(2,3),
(2,4),
(3,1),
(3,2),
(4,1),
(4,2),
(5,1),
(5,6),
(6,5),
(7,8),
(8,7);
Бизнес-логика: нам необходимо выяснить, какие пользователи являются друзьями или друзьями друзей для данного пользователя.Текущий запрос для этого пользователя с user_id = 1:
SELECT friend_id FROM friends WHERE user_id = 1
UNION
SELECT DISTINCT friend_id FROM friends WHERE user_id IN (
SELECT friend_id FROM friends WHERE user_id = 1
);
Ожидаемый результат (порядок не имеет значения):
2
3
4
5
1
6
Как видите,Приведенный выше запрос выполняет подзапрос «SELECT friend_id FROM friends WHERE user_id = 1» дважды.
Итак, вот вопрос.Если производительность является вашей главной задачей, как бы вы изменили вышеуказанный запрос или схему?
Заранее спасибо.