Verwendung eines Indexes in MySQL JOIN mit OR-Bedingung

Ich starte eine Abfrage, die so aussieht

SELECT parent.field, child.field
FROM parent
JOIN child ON (child.id = parent.id 
    OR child.id = parent.otherid)

Dies ist jedoch sehr langsam (ungefähr 100.000 Datensätze und Verknüpfungen zu anderen Tabellen in der Real-Version), obwohl Indizes anprobiert wurden

parent.id (PRIMARY),  
parent.otherid,  
child.id (PRIMARY), 
and a composite index of parent.id and parent.otherid

Ich kann MySQL nicht dazu bringen, einen dieser Indizes zu verwenden, wenn ich diesen Join mache.

Ich habe gelesen, dass MySQL nur einen Index pro Join verwenden kann, aber nirgendwo feststellen kann, ob es einen zusammengesetzten Index verwenden kann, wenn ein JOIN eine OR-Bedingung enthält.

Weiß hier jemand, ob es möglich ist, diese Abfrage auf einen Index zu verweisen? Wenn das so ist, wie?

MEINE LÖSUNG

(SO werde ich meine eigene Frage nicht unter atm beantworten lassen)

Eine Reihe von Optimierungen und eine ziemlich anständige Lösung, die es weiterhin ermöglicht, sich anderen Tabellen anzuschließen und diese zu aggregieren.

SELECT parent.field, child.field
FROM parent
JOIN (
    SELECT parent.id as parentid, 
    # Prevents the need to union
    IF(NOT ISNULL(parent.otherid) AND parent.otherid <> parent.id, 
       parent.otherid, 
       parent.id) as getdataforid
    FROM parent
    WHERE (condition)
) as foundrecords
    ON foundrecords.parentid = parent.id
JOIN child ON child.id = parent.getdataforid

Für die Geschwindigkeit ist eine Bedingung in der Unterabfrage erforderlich, um die Anzahl der in einer temporären Tabelle platzierten Datensätze zu verringern. Die äußere Abfrage enthält jedoch eine Vielzahl zusätzlicher Verknüpfungen, von denen einige mit dem untergeordneten und einige mit dem übergeordneten Element (mit einigen Aggregaten) verknüpft sind funktionierte am besten für mich.

In vielen Fällen ist eine Vereinigung schneller und effektiver. Da ich jedoch nach übergeordneten Elementen filtere, aber zusätzliche Daten von untergeordneten Elementen (übergeordnete Selbstreferenzen) benötige, hat die Vereinigung zusätzliche Zeilen für mich verursacht, die ich nicht konsolidieren konnte. Es ist möglich, dass dasselbe Ergebnis erzielt wird, wenn man nur die übergeordnete Komponente mit sich selbst verbindet und eine where-Bedingung in der äußeren Abfrage als Alias ​​verwendet. Diese Abfrage funktioniert jedoch für mich recht gut.

Vielen Dank an Jirka für den Vorschlag von UNION ALL, der mich dazu bewogen hat, hierher zu kommen :)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage