Como substituir o operador OR pelo operador UNION?

Aqui está a minha consulta:

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;

Concentre-se nesta linha de consulta acima:

WHERE h.id = :id1 OR h.related = :id2

Como você vê, háOR operador lógico entre essas duas condições. Como você sabe,OR geralmente impede o uso efetivo de índices. Portanto, quando há dados enormes, o desempenho da minha consulta é realmente fraco.

Como posso melhorar isso? Na verdade, estou tentando substituirOR comUNION, mas como você vê, minha consulta é muito longa. Existe alguma ideia?

EDITAR: Aqui está o resultado deEXPLAIN: (para um conjunto de dados muito curto - total de 20 linhas)

questionAnswers(3)

yourAnswerToTheQuestion