MySQL Query - Получить все отзывы подписчиков - PullRequest
0 голосов
/ 29 марта 2020

Интересно, как я мог бы сделать это более эффективным. К сожалению, это очень медленно, потому что таблицы имеют много строк.

Я хочу получить все отзывы пользователей, за которыми следовал пользователь 1:

SELECT r.id, r.title

FROM followers f

LEFT JOIN reviews r ON r.user_id = f.followers_id

WHERE 

f.user_id = 1 AND
r.user_id = f.follower_id

ORDER BY r.`id` 

Ответы [ 3 ]

0 голосов
/ 29 марта 2020

Если в таблице много строк, мы можем сделать запрос быстрее с помощью индексации. Таким образом, в этом случае, если мы добавим индекс для последователей. уже есть индексы.

Вы не написали запрос правильно, правильный запрос будет -

ВЫБРАТЬ r.id, r.title ОТ последователей f СЛЕДУЮЩИЕ ОБЪЕДИНЕНИЯ обзоров r ON r.user_id = f.followers_id ГДЕ f.user_id = 1 И ЗАКАЗАТЬ ПО r. id;

  • Нет необходимости использовать - r.user_id = f.follower_id , поскольку он уже включен в условие соединения
  • Запрос не может быть быстрее этого. Вы можете заставить его работать быстрее, только если вы увеличите размер аппаратного обеспечения (RAM и #Core), где установлен MySql.

Надеюсь, это поможет, прокомментируйте, если у вас есть дальнейшие сомнения.

0 голосов
/ 29 марта 2020

LEFT JOIN не имеет смысла. Вы хотите вернуть строки из reviews, поэтому вам нужны совпадения.

Я бы посоветовал вам попробовать EXISTS

SELECT r.*
FROM reviews r
WHERE EXISTS (SELECT 1
              FROM followers f
              WHERE r.user_id = f.followers_id AND
                    f.user_id = 1
             )
ORDER BY r.id;

Затем для этого запроса вам нужен индекс для followers(followers_id, user_id). Предположительно reviews.id уже является первичным ключом.

0 голосов
/ 29 марта 2020

Полагаю, вам не нужны null s в результатах, поэтому нет необходимости в LEFT JOIN, хотя, установив условие:

r.user_id = f.follower_id

, которое существует в * В предложении 1006 * также в предложении WHERE вы получите INNER JOIN, потому что все несопоставленные строки отфильтрованы. Попробуйте это:

SELECT r.id, r.title
FROM reviews r INNER JOIN followers f
ON r.user_id = f.follower_id
WHERE f.user_id = 1 
ORDER BY r.id

или отфильтровав таблицу followers, а затем присоединившись:

SELECT r.id, r.title
FROM reviews r 
INNER JOIN (SELECT follower_id FROM followers WHERE user_id = 1) f
ON r.user_id = f.follower_id 
ORDER BY r.id

или вот это:

SELECT id, title
FROM reviews 
WHERE user_id IN (SELECT follower_id FROM followers WHERE user_id = 1) 
ORDER BY id

Индексы по столбцам user_id из reviews и user_id, follower_id из followers действительно ускорили бы запрос.

...