• ベストアンサー

インデックスのアルゴリズムとBツリー

主キーじゃないカラムにインデックスを張るとき、 つまり、値が重複することがありうる場合に 利用されるBツリーは通常のBツリーと比較して、 どのように変更すればよいものでしょうか。 また、WHERE句内で * などを使用して検索するとき、 どのようにBツリー内を検索すれば効率的でしょうか。 データベースの実装に関する質問になりますが、 わかる方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>利用されるBツリーは通常のBツリーと比較して、 >どのように変更すればよいものでしょうか。 末端においてテーブルの該当レコードのポインタを格納するのではなく、ポインタの集合が格納されている領域のポインタを格納しておく >また、WHERE句内で * などを使用して検索するとき、 >どのようにBツリー内を検索すれば効率的でしょうか。 *ってワイルドカードのことですか?DBでは普通は%ですけど。 検索方法はbetweenと一緒でしょう。 あと、先頭にワイルドカードが指定されている場合はインデックスは使用しません。 こんなの見つかりましたけど。 http://www.hi-ho.ne.jp/tsumiki/doc_1.html

参考URL:
http://www.hi-ho.ne.jp/tsumiki/doc_1.html
Harry_
質問者

お礼

回答ありがとうございます。 > ポインタの集合が格納されている領域のポインタを格納しておく ここには一般的にどういうデータ構造が使用されるのですか? リンクリストでしょうか。 > *ってワイルドカードのことですか?DBでは普通は%ですけど。 ワイルドカードです。バカなことを書いてしまいました。 between 指定したときの検索については 参考URLが非常に役に立ちました。 リーフ同士をリンクさせるのですね。。。 疑問点は大体消えました。 どうもありがとうございます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>ここには一般的にどういうデータ構造が使用されるのですか? >リンクリストでしょうか。 すべての重複項目をリンクリストで作るよりは、ある程度の領域を取ってまとめて格納し、あふれた分は別の領域へのリンクでしょうね、おそらく。

Harry_
質問者

お礼

なるほど。。 色々勉強になりました。 ありがとうございます。

関連するQ&A

  • インデックス「いいえ」 インデックス「はい (重複

    アクセスのテーブルについて質問なんですが インデックス「いいえ」 インデックス「はい (重複あり)」 の違いはなんでしょう? はい (重複なし)にすると、インデックス「いいえ」 と見た目は変わらないけど、 検索や並べ替えをする時に若干早くなるって事でしょうか? インデックス「はい (重複なし)」にした場合は、 主キーと同様、重複した値を入力できないので 違いが一目瞭然にわかりました。

  • 複合インデックスの設定に関して

    MySQLの複合インデックスに関して質問させて頂きます。 現在検索条件に3つのカラムを使用して検索をかけているSELECT文があります。 データの件数は100万件ほどあるとします。 【例】 「SELECT * FROM test WHERE a = '1' AND b = 'xxxxx' AND c = '1';」 カラム「a」「c」は、0と1のみが格納されたカラムで、頻繁に更新されます。 カラム「b」は、同じ値が入ることがありますが、ほぼユニークな文字列が格納されます。 上記のような場合、インデックスは ・「a,b,c」の全てを設定した複合インデックスを作成するべきか。 ・cは頻繁に更新されるので、「a,b」のみの複合インデックスを作成するべきか。 ・aも同じく頻繁に更新されるので、WHERE句の検索順をbを先に持ってきて、「b」のみの単独インデックスを作成するべきか。 一概にこうだという答えは無いかもしれませんが、何か良い方法があれば教えて頂けると幸いです。 また、質問に不備な点がございましたら、ご指摘お願いいたします。

    • ベストアンサー
    • MySQL
  • MySQL マルチカラムインデックスでの範囲検索

    InnoDBでマルチカラムインデックスをもつテーブルに対して、1つ目のキーに範囲検索を行った場合、2つ目のキーはどんな場合も使われないのでしょうか? ■前提 ・テーブル名  tbl ・カラム  kaypert1(DATETIME) ,keypart2(INTEGER) ・インデックス  kaypert1,keypart2 このテーブルに対し、  SELECT * FROM bl WHERE keypart1 < '2009-03-31 20:00:00' AND keypart2 = 3; とした場合。 自分のイメージとしては、この検索でB-Treeの形としてkeypart1であてはまったデータそれぞれの下のTree(keypart2)を見に行くのかなと思っていました。 ただ、「LinuxDBシステム構築運用入門」という本を見ると、マルチカラムインデックスをもつテーブルに対して、1つ目のキーに範囲検索を行った場合は2つ目以降のキーは全く使われないと書いてあったので確認をしたいです。

  • Access結合後の短いテキスト型のインデックス

    Accessの検索にて、テーブルA LEFT JOIN テーブルB で外部結合し、 WHERE句でテーブルBの短いテキスト型を抽出条件にすると、検索が遅くなります。 【テーブル定義】 テーブルA( ・年月日(日付/時刻、重複ありインデックス) ・コード(短テキスト、重複ありインデックス) ・属性あ(短テキスト、重複ありインデックス) ・属性い(短テキスト、重複ありインデックス) ) テーブルB( ・コード(短テキスト、主KEY) ・属性う(短テキスト、重複ありインデックス) ・属性え(数値、重複ありインデックス) ) 【件数】 テーブルA:15万件 テーブルB:500件 =====SQLここから===== SELECT * FROM テーブルA LEFT JOIN テーブルB ON テーブルA.コード = テーブルB.コード WHERE 属性あ IS NULL AND 属性い = 'あああ' AND 属性う = 'アアア' AND 属性え = 1 GROUP BY 年月日、 属性う =====SQLここまで===== この検索SQLは遅い(1分30秒くらい)のですが 『AND 属性う = 'アアア'』を削除すると 10秒くらいに速くなります。 ”属性う” のインデックスが効いてないように見えるのですが どのようにチューニングしたら速くなるでしょうか? エクセルからLAN越しにDAO接続してSQL実行してます。 AccessはOffice365(バージョン1902)です。

  • インデックスを張るべき項目について

    20万件レコードのあるテーブルに、インデックスを張ると INSERTが遅くなるので、WHERE句で検索する項目のどれに インデックスを張るか悩んでいます。 インデックスはパターンが多い程、張った場合に 検索速度が向上すると理解しているのですが正しいでしょうか? であれば、下記1.だけは貼ろうと思っているのですが・・ 1.カラムに入るデータが殆どバラバラのVARCHAR(30) 2.カラムに入るデータは10万パターンのINT型 3.カラムに入るデータは1万パターンのINT型 4.カラムに入るデータはdatetime型 インデックスを張る事でINSERT速度が何%ぐらい下がるでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • INDEX RANGE SCAN とは?

    OracleのINDEX RANGE SCANについての質問です。 私の理解のレベルでは、INDEX RANGE SCANは範囲検索をする時に発生し、 それ自体は効率的にインデックスを利用している状態である、と理解しています。 もっといえば、betweenを使用したり演算子に「>=」などの不等号を使用した とき以外には発生しないはずと思っていました。 しかし先日、条件部分に「=」等号しかないSQLにてINDEX RANGE SCANが発生しました。 INDEX SKIP SCAN ならまだ話はわかるのですが、間違いなくINDEX RANGE SCANでした。 範囲検索で無い場合にINDEX RANGE SCANになる意味がよくわかりません。 ■以下質問です。 範囲検索の場合にINDEX RANGE SCANになるという私の認識はあっているか。 どのような場合に、等価条件だけの場合にINDEX RANGE SCANになるのか。 等価条件だけなのにINDEX RANGE SCANになる場合、検索の仕組みについて。 ■参考情報として記述しておきます。 バージョンは9iです。 1つのテーブルに対するSELECT文で where句には4つのカラムが等価条件で指定されています。 これらのカラムは条件・カラムの値ともにNULLではありません。 関係あるかわかりませんが、カーディナリティが高いにもかかわらず 適切なインデックスが無いSQLでした。 よろしくお願いします。

  • mysqlのindexとprimary keyについて

    indexキーとprimary keyについてですが、違いというのは、NULLが許可されるか、されないかの違いでしょうか? データベースから検索する際に、indexキーがある方が検索スピードが速いということですが、あるHPに《PRIMARY KEY が宣言されたカラムは自動で Index Key と Unique Key が適応されます》とありました。 ですので、検索スピードを上げるには、PRIMARY KEYを設定すれば、indexキーが設定されたのと同じ事になるのでしょうか?

    • ベストアンサー
    • MySQL
  • インデックスについて

    オラクルのインデックスについて教えてください。 ObjectBrowserというソフトでオラクルDBを管理しているのですが、 インデックスとCONSTRAINTというものの違いが良くわかりません。 現在ObjectBrowserで、インデックスを重複不可にすることで、そのテーブルの 主キーとしています。しかし、CONSTRAINTでPRIMARYKEYも設定できることに 最近気づきました。 ObjectBrowserに限らず、この違いについて教えてもらえないでしょうか? どのような時にインデックスを使い、CONSTRAINTのPRIMARYKEYはこのような時に 使用するという風にお教えていただければ幸いです。 何分、データベース初心者なもので... 宜しくお願い致します。

  • 検索条件が複数の場合のインデックスの張り方

    Mysql5.0 + ASP.NETで開発中です。 サーバーはWindows2003サーバーです。 とある検索サイトを作っていますが、1テーブルのフィールド数が80くらいあります。 また、レコード数は常時100万件程度です。 このテーブルの検索を行うときに、ユーザーが任意の検索条件を設定できるような画面なのですが、実際に検索に使用されるフィールド数は最大で10です。 例えば、where a = 999 and b = 999 や where a = 999 and c = 999 and f = 999 や where b = 999 and d = 999 and f = 999 and g = 999 など、where句で使用されるフィールドがユーザーの指定により常に異なります。(999は任意の値です) ORDER BYに使用されるフィールド数は3です。 現状ではインデックスは張っていないため、かなり検索速度が遅いため、インデックスを張りたいのですが、どのような張り方がいいのかがわかりません。 このような場合、インデックスを張る方法として、どの方法が一番よいのでしょうか? 1.検索に使用される10つのフィールドに1つずつ張ればよい 2.検索に使用される10つのフィールドとソートに使用される3つのフィールドに1つずつ張ればよい 3.where句の組み合わせを全て考えて複合インデックスを張る必要がある。 4.その他 また、80フィールドのテーブルを適当に4つくらいに分けて、検索時に結合すれば早くなったりするものでしょうか?

  • ユニークインデックスについて

    仕事の関係で、テーブル定義の際にユニークインデックスをどの列の組み合わせにするのか考える必要があるのですが、今までユニークインデックスの存在自体知らず、困っています。 自分自身でネット等で調べた結果以下のことは理解できました。  1.ユニークインデックスで指定された列は値が一意でなければならない。  2.主キーの列にはNULL値は不可だが、ユニークインデックスの列はNULL値も可。  3.主キーは一つのテーブルにつき、一つしか設定できないが、    ユニークインデックスは複数設定できる。(同じ列は指定できない)  4.主キー設定時、実は暗黙的にユニークインデックスとNOT NULL制約が作成されている。 ここまでは分かったのですが、主キーとは別で、明示的にユニークインデックスを指定する必要性とはなんなのでしょうか? 主キーとは別で明示的に指定した方が良い場合と、その実例をどなたか教えて頂けないでしょうか? よろしくお願いします。