Wie wird der Operator OR durch den Operator UNION ersetzt?

Hier ist meine Frage:

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;

Bitte konzentrieren Sie sich auf diese Abfragezeile oben:

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

ie Sie sehen, gibt esOR logischer Operator zwischen diesen beiden Bedingungen. Wie du weißt,OR verhindert normalerweise die effektive Verwendung von Indizes. Wenn also große Datenmengen vorliegen, ist die Leistung meiner Abfrage sehr gering.

Wie kann ich es verbessern? Eigentlich versuche ich @ zu ersetzOR mitUNION, aber wie Sie sehen, ist meine Abfrage zu lang. Gibt es also eine Idee?

BEARBEITEN Hier ist das Ergebnis vonEXPLAIN: (für einen wirklich kurzen Datensatz - insgesamt 20 Zeilen in)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage