Генерация dummy data в MySQL

Есть три MySQL таблицы, все InnoDB:
users:
— id (index)

friend_requests:
— user1 (index)
— user2 (index)

friend_data:
— user1 (index)
— user2 (index)

Есть 50 000 фейковых пользователей, нужно нагенерировать по 10 запросов в друзья и по 10 дружб для каждого пользоватля с другими рандомными пользователями.

Подскажите, пожалуйста, быструю выборку для получения случайного пользователя, у которого еще нет связей в таблицах friend_requests и friend_data. Сейчас используется этот запрос, но он работает уж слишком медленно.
SELECT
	u.id
	FROM
		users AS u
	LEFT JOIN friend_data AS f ON u.id IN (f.user1, f.user2) AND $ID IN (f.user1, f.user2)
	LEFT JOIN friend_requests AS fr ON u.id IN (fr.user1, fr.user2) AND $ID IN (fr.user1, fr.user2)
	WHERE
		(f.id IS NULL)
		AND
		(fr.id IS NULL)
		AND
		u.id <> $ID
	ORDER BY RAND()
	LIMIT 1

Если использовать случайный OFFSET вместо ORDER BY RAND(), то запрос работает немножечко быстрее, но все равно больше 5 секунд, что, увы, слишком медленно.

$ID это пользователь, с которым сравниваю.
  • Вопрос задан
  • 3234 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Steely
Ответ написан
Комментировать
7workers
@7workers
Убедитесь, что индексы есть по нужным полям. 5 секунд это очень медленно.
Ответ написан
@LastDragon
См. комментарии к habrahabr.ru/post/54176/
Ответ написан
Комментировать
AxisPod
@AxisPod
Условия по 3м таблицам, индексы вряд ли взлетят <> с индексами не дружит. ORDER BY RAND() так же не дружит с индексами, при этом обходит полностью все выбранные записи для выдачи каждой строки. Запрос даже сам по себе не очень хорош, да еще видимо и индексов нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы