0

インデックスにb-treeを使いたいのですが、ORクエリの解決策が思いつきません。

OR クエリの場合、 select * from table where id between 1 and 5 OR id between 10 and 15; のようなものを意味します。

B ツリーで id をキーとして使用する場合、B ツリーで上記のようなクエリを実行するにはどうすればよいですか?

b ツリーを検索するときは、6 より小さいキーと 6 より大きいキーが異なるサブツリーにあると仮定します。検索パスが 6 より小さいキーを含むサブツリーを通過する場合よりも、 1 から 5 の間は取得できますが、10 から 15 の間の id はどうでしょうか。

b+tree を使用する必要がありますか? ID 1 を指すキーが見つかったら、ID 15 を指すキーが見つかるまで、リーフ ノードを 1 つずつスキャンし続けますか? この種のクエリの悪い解決策ですか: select * from table where id between 1 and 5 OR id between 10000000 and 10000005 ???

または、他の解決策はありますか?

どうもありがとうございました!

4

2 に答える 2

1

ORキーワードはよくある問題です。インデックスの観点からは、通常は 2 つのルックアップを行うのが最善です (たとえば、UNION のように)。

ただし、例外があります。最初の例 (id が 1 から 5、または id が 10 から 15) は、1 から 15 までの 1 つのインデックス ルックアップで実行し、値 6 から 9 を破棄するのが最適です。ただし、それはデータ量によって異なります。2 番目の例 (1 から 5 の間、または ID が 10000000 から 10000005 の間) は、そのアプローチの適切な候補ではないようです。ただし、ID の数ではなく、行の数に依存します。

ANDに関して: あなたの例は矛盾しています (ID が 1 から 5 の間、ID が 10000000 から 10000005 の間)、クエリは行を返しません。一部のオプティマイザーはそれを「見る」ことができます。

異なる列のAND条件は、連結されたインデックスで解決されます。

私の Web ブックを見てください。インデックスを使用してください、ルーク! 詳細については。

于 2010-08-23T06:11:14.530 に答える
1

OR 演算は、2 つの検索を実行する必要があり、結果を結合することを意味します。

于 2010-08-20T18:13:51.310 に答える