私はこのようなクエリを実行しています
SELECT parent.field, child.field
FROM parent
JOIN child ON (child.id = parent.id
OR child.id = parent.otherid)
ただし、これは非常に遅いです(実際のバージョンでは約100kレコード、および他のテーブルへのJOIN)が、インデックスを試したにもかかわらず
parent.id (PRIMARY),
parent.otherid,
child.id (PRIMARY),
and a composite index of parent.id and parent.otherid
この結合を行うときに、MySQL にこれらのインデックスを使用させることができません。
MySQL は結合ごとに 1 つのインデックスしか使用できないと読みましたが、JOIN に OR 条件が含まれている場合に複合インデックスを使用できるかどうかはどこにもわかりません。
このクエリ参照をインデックスにすることが可能かどうかを知っている人はいますか? もしそうなら、どのように?
私の解決策
(だから、atmの下で私自身の質問に答えさせてくれません)
たくさんの微調整を行い、他のテーブルを結合して集計する機能を保持する、かなり適切なソリューションを思いつきました。
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
速度のためには、一時テーブルに配置されるレコードの数を減らすためにサブクエリ内の条件が必要ですが、外部クエリに大量の追加の結合があり、子への結合と親への結合(いくつかの集計を含む)があるため、これ私にとって最もうまくいきました。
多くの場合、ユニオンの方が高速で効果的ですが、親でフィルタリングしているため、子からの追加データ (親の自己参照) が必要なため、ユニオンによって余分な行が発生し、統合できませんでした。親をそれ自体に結合し、外側のクエリで where 条件をエイリアシングするだけで同じ結果が得られる可能性がありますが、これは私にとっては非常にうまく機能します。
UNION ALLの提案をしてくれたJirkaに感謝します。それが私がここにたどり着くきっかけです:)