私はH2を使用しています。多対多の関係で接続されたブック(テーブルエントリ)と作成者(テーブルPersons)テーブルの著者。 データベースはかなり大きい(900,000 +人、2.5M +本)。H2で多対多の関係から効率的に選択
名前がパターン(LIKE '%パターン%')に一致する少なくとも1人の作者によってオーサリングされたすべての書籍のリストを効率的に選択しようとしています。ここでのトリックは、パターンが一致する著者の数を大幅に制限し、各著者の関連書籍が合理的に少ないことです。
SELECT p.*, e.title FROM (SELECT * FROM Persons WHERE name LIKE '%pattern%') AS p
INNER JOIN Authorship AS au ON au.authorId = p.id
INNER JOIN Entries AS e ON e.id = au.entryId;
と:
私は2つのクエリ試み
SELECT p.*, e.title FROM Persons AS p
INNER JOIN Authorship AS au ON au.authorId = p.id
INNER JOIN Entries AS e ON e.id = au.entryId
WHERE p.name like '%pattern%';
を私は著者のはるかに小さい(サブ)テーブルを結合していたように最初のものは、はるかに高速であると予想しました、しかし、彼らはどちらも長くかかる。実際には、私は手動で3つの選択肢にクエリを分解し、私がより速くしたい結果を見つけることができます。
私はクエリをEXPLAINしようとすると、実際には非常に似ていることがわかります(テーブルとWHERE句の完全結合)ので、私の質問は次のとおりです。著者のフィルタは、他の2つのテーブルとの結合がずっと小さくなる必要があるという事実に基づいていますか?
私は同じクエリをMySQLで試してみましたが、私が期待していたもの(一番早いものを選ぶほうがはるかに速い)に沿った結果が得られました。
ありがとうございます。あなたのパターンは%
MySQLで'%pattern%'
開始はどのインデックスを使用することはできませんし、全表スキャンを行う必要がある場合ので
なぜ最初のJOINでSUBSELECTですか?単純に「INNER JOIN authorship AS au ON ...」にならないのはなぜですか? – wonk0
あなたが正しいです、私は変更を加えました。クエリは(少なくともEXPLAINによると)同じものに変換されますが、現在はより簡単です。 – Philippe
これらのクエリの 'EXPLAIN ANALYZE SELECT ... 'の結果は何ですか? –