2013-06-11 4 views
3

Я разрабатываю новый проект. Мне нужна помощь для запроса mysql, я думаю, что это очень медленно.Как оптимизировать этот мой mysql-запрос?

SELECT post_id, user_id, content, title, TIME, (

SELECT username 
FROM users 
WHERE id = posts.user_id 
) AS username 
FROM posts 
WHERE user_id =1 
OR user_id 
IN (

SELECT DISTINCT user_to 
FROM friends 
WHERE user_from =1 
OR user_to =1 
) 
ORDER BY posts.post_id DESC 
LIMIT 0 , 10 

Спасибо за любую помощь.

+1

Вторая часть начинается с '' OR user_id IN (...) '', вероятно, является причиной ваших проблем с производительностью. Попытайтесь устранить это, чтобы увидеть, насколько быстро этот запрос без него. – mzedeler

ответ

2

Try:

SELECT p.post_id, p.user_id, p.content, p.title, p.TIME, u.username 
FROM (select distinct us.* 
     from friends f 
     join users us on f.user_to = us.id 
     WHERE f.user_from =1 OR f.user_to =1) u 
JOIN posts p on u.id = p.user_id 
ORDER BY p.post_id DESC 
LIMIT 0 , 10 
+0

Спасибо большое! – user2473500

+0

@ user2473500: Добро пожаловать! –

4

Вы можете использовать INNER JOIN запрос

SELECT a.post_id, a.user_id, a.content, a,title, a.TIME, b.username 
FROM posts a 
INNER JOIN users b 
ON a.user_id = b.id 
WHERE a.user_id =1 
OR a.user_id 
IN (

    SELECT DISTINCT user_to 
    FROM friends 
    WHERE user_from =1 
    OR user_to =1 
) 
ORDER BY a.post_id DESC 
LIMIT 0 , 10 

Это должно быть быстрее, чем ваш запрос.

+0

+1 вы можете сделать это еще дальше, а вместо 'DISTINCT' вы можете использовать' GROUP BY' и 'ORDER BY NULL', чтобы предотвратить использование mysql filesort – Stephan

+0

К сожалению, я получаю DB Exeption: у вас есть ошибка в вашем Синтаксис SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'b.id WHERE a.user_id = 1 ИЛИ a.user_id IN (SELECT DIST' в строке 4 [SELECT a.post_id, a.user_id, a .content, a, title, a.TIME, b.username FROM отправляет пользователей INNER JOIN b ON a.user_id b.id WHERE a.user_id = 1 ИЛИ a.user_id IN (SELECT DISTINCT user_to FROM friends WHERE user_from = 1 ИЛИ user_to = 1) ORDER BY a.post_id DESC LIMIT 5 OFFSET 0] – user2473500

+0

@ user2473500 мой плохой, извините, что он отсутствовал равным, пожалуйста, проверьте его сейчас – Fabio

4

Попробуйте один -

SELECT 
    p.post_id 
    , p.user_id 
    , p.content 
    , p.title 
    , p.`time` 
    , u.username 
FROM posts AS p 
/*LEFT*/ JOIN users AS u ON u.ID = p.user_id 
WHERE user_id = 1 
    OR user_id IN (
     SELECT DISTINCT user_to 
     FROM friends 
     WHERE user_from = 1 
      OR user_to = 1 
    ) 
ORDER BY p.post_id DESC 
LIMIT 0, 10 
Смежные вопросы