Вот мой запрос:Как заменить оператор OR с оператором UNION?
SELECT
h.id,
h.subject,
h.body matnF,
h.amount,
h.keywords tags,
h.closed,
h.author_id author,
h.AcceptedAnswer,
h.type,
h.visibility,
h.date_time,
v.value AS vote_value,
u.reputation,
u.user_fname,
u.user_lname,
u.avatar,
(h.author_id = user_id1) as hasUserId,
(select COALESCE(sum(vv.value), 0)
from votes vv
where h.id = vv.post_id and vv.table_code = '$this->table_code'
) as total_votes,
(select count(1)
from favorites ff
where h.type = 0 and h.id = ff.post_id and ff.table_code = '$this- >table_code'
) as total_favorites,
CASE WHEN h.type = 1 THEN '0'
WHEN h.amount IS NULL OR h.author_id = :user_id2 THEN '1'
ELSE EXISTS(select 1
from money m
where m.user_id = :user_id3 and m.post_id = h.id
)END paid,
CASE WHEN h.type = 0 AND f.id IS NOT NULL THEN '2'
ELSE '3'
END AS favorite
FROM qanda h
LEFT JOIN votes v ON h.id = v.post_id AND v.user_id = :user_id4 AND v.table_code = '$this->table_code'
LEFT JOIN favorites f ON h.type = 0 AND h.id = f.post_id AND f.user_id = :user_id5 AND f.table_code = '$this->table_code'
LEFT JOIN users u ON h.author_id = u.id and h.visibility = 1
WHERE h.id = :id1 OR h.related = :id2
ORDER BY h.type , h.AcceptedAnswer DESC , h.date_time
LIMIT 20;
Пожалуйста, сосредоточить внимание на этой линии запроса выше:
WHERE h.id = :id1 OR h.related = :id2
Как вы видите, есть OR
логический оператор между этими двумя условиями. Как вы знаете, OR
обычно препятствует эффективному использованию индексов. Поэтому, когда есть огромные данные, производительность моего запроса очень слабая.
Как его улучшить? На самом деле я пытаюсь заменить OR
на UNION
, но, как вы видите, мой запрос слишком длинный. Так есть идея?
EDIT: Вот результат EXPLAIN
: (за очень короткий набор данных - общая 20 строк в)
Ну, я получил его несколько .. upvote –
Но что происходит с предложением WHERE? В моем запросе? А также да, обычно выбирается несколько строк * (максимум 5 строк) * ..! Можете ли вы применить свою идею по моему первоначальному запросу и добавить ее к своему ответу? –
@Stack. , , Вы должны удалить предложение 'where'. Он избыточен, потому что он находится в подзапросе. –