Оптимизировать запрос: Выбрать в Выбрать - PullRequest
1 голос
/ 26 октября 2011

Допустим, у меня есть таблица для хранения блогов (имя таблицы - блоги) каждого пользователя. Но также есть таблица для хранения блогов других пользователей, которые понравились пользователю (имя таблицы - likeBlogs), да?

поэтому, чтобы получить их, я просто делаю: -Выберите блоги пользователей. -Добавить блоги, которые ему понравились.

    $q = mysql_query("
SELECT id 
FROM blogs 
WHERE (iduser = $id) 
      OR id IN 
       (SELECT idblog 
        FROM likedBlogs 
        WHERE iduser='$id') 
      AND (id > 0) 
ORDER BY id DESC 
LIMIT 20
") or die(mysql_error());

Могу ли я сделать это лучше? (как бы вы оценили производительность по этому запросу?)

Спасибо

Ответы [ 4 ]

2 голосов
/ 26 октября 2011

Обычно вы используете join вместо вложенных select.

select blogs.id
from blogs inner join likedBlogs on (blogs.iduser = likedBlogs.iduser and blogs.id  = likedBlogs.idblog)
where blogs.iduser = $id
and blogs.id > 0
order by blogs.id desc limit 20

upd первый раз, когда я не правильно прочитал оператор задачи

select blogs.id 
from blogs left join likedBlogs on (blogs.id = likedBlogs.idblog)
where blogs.iduser = $id or likedBlogs.iduser = $id;
2 голосов
/ 26 октября 2011

Полагаю, вы можете лучше реорганизовать его, используя EXISTS вместо IN.

IN требует возврата всего набора результатов, а затем начать поиск значения, но EXISTS проверять строку за строкой и прерыватьвнутренний запрос при обнаружении первого вхождения.

SELECT id  
FROM blogs  
WHERE (iduser = $id)        
OR EXISTS
      (SELECT idblog         
       FROM likedBlogs          
       WHERE iduser='$id' AND idblog = id)
AND (id > 0)  
ORDER BY id 
DESC  LIMIT 20 

См. Оптимизация IN / = ЛЮБЫХ подзапросов

Очень полезная оптимизация состоит в том, чтобы «сообщить» подзапросу, чтоинтересны только те строки, в которых внутреннее выражение inner_expr равно external_expr.Это делается путем нажатия соответствующего равенства в предложении WHERE подзапроса.То есть сравнение преобразуется в это: EXISTS (ВЫБЕРИТЕ 1 ИЗ ... ГДЕ subquery_where И external_expr = inner_expr)

0 голосов
/ 26 октября 2011

Я думаю, что вы могли бы лучше обслужить профсоюз

SELECT id 
FROM blogs 
WHERE iduser = $id AND id > 0
UNION 
SELECT idblog AS id 
FROM likedBlogs 
WHERE iduser='$id' AND idblog > 0
0 голосов
/ 26 октября 2011

Ваш запрос выглядит нормально для меня.Для повышения производительности следует убедиться, что у вас есть индексы для столбцов идентификаторов в таблицах базы данных.

...