• ベストアンサー

インデックス(index)とはなんでしょうか?仕組みを教えてください。

なんとなくは分かっているのですが、その仕組みが、まだしっくりといってません。 例えば、「zoo」という英単語を辞書で調べる時に、Aから順に総当りでページをめくっていては日が暮れます。その場合、Zに目印をつけておけば、すぐに見つけることができますよね。 インデックスとは、これと似たような仕組みなのでしょうか? もしそうであれば、単語内に、「oo」がある文字を探すにはどうすればよいのでしょうか?総当りで調べていく以外の方法が分かりません。 また、もしインデックスを張ることによって、SELECTの速度が上がるのであれば、なぜ全カラムにインデックスを張らないのでしょうか? インデックスを張るデメリットは何でしょうか?また、インデックスを張るか張らないかの基準は何でしょうか?

  • MySQL
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

インデックスを簡単に説明すると、指定されたキーに基づいてインデックスファイルを作成し、select文等のSQL文を実行するときに利用されます。 。作り方の1つとして、キーに基づいて行を並び替え、その真ん中・真ん中を比較しながら求めていけるようにします。 これで全行検査(n行)より早くなります。(数学的にはlog2(n)のオーダーでしょうか) >もしそうであれば、単語内に、「oo」がある文字を探すにはどうすればよいのでしょうか?総当りで調べていく以外の方法が分かりません。  これに関しては、プログラムで対処する以外、SQL文だけではわかりません。 >また、もしインデックスを張ることによって、SELECTの速度が上がるのであれば、なぜ全カラムにインデックスを張らないのでしょうか?インデックスを張るデメリットは何でしょうか?また、インデックスを張るか張らないかの基準は何でしょうか?    更新や削除が頻繁に行われる場合、インデックスファイルの更新に余分に時間がかかることになります。また、インデックスは、複数のキーからも構成されますから、利用目的に応じて作ることになります。  張るか張らないかの基準は、経験を積みながら対処することになるでしょう。  下記のページが参考になるでしょう。

参考URL:
http://itpro.nikkeibp.co.jp/article/COLUMN/20060111/227105/
sweepea
質問者

お礼

ご回答ありがとうございます。 頂いたURLの > インデックスが付加されているフィールドであっても,LIKE '%AAA' のような「後方一致」を指定すると,インデックスを検索せずにデータ部の全表走査が行われます。 という一文で、indexの正体が、なんとなく何者か分かりました。 極めるためには、やはり > 張るか張らないかの基準は、経験を積みながら対処することになるでしょう。 に尽きると思いました。 ありがとうございました。

その他の回答 (1)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>インデックスとは、これと似たような仕組みなのでしょうか? 辞書でいえば「見出し」そのものですね。少なくとも見出しが順番に並んでいるという前提があれば、Zに目印があろうがなかろうが索引は便利です。順番に並んでいなければ確実に全件を調べないといけませんよね?昇順に並んでいればたとえば二分検索などですばやくたどり着けます。 >もしインデックスを張ることによって、SELECTの速度が上がるのであれば、 >なぜ全カラムにインデックスを張らないのでしょうか? データの挿入や削除の時に、indexも同時に挿入・削除する必要があります。indexが多くなればそれだけDBサーバの仕事が増えます。なので、あとで検索や連結に使う項目に絞ってindexにします。

sweepea
質問者

お礼

ご回答ありがとうございます。 確かに、複雑な処理が増えるので、INSERTやUPDATEにも付加がかかりますね。 後は経験を積んで、学んでいこうと思います。 ありがとうございました。

関連するQ&A

  • SQLテーブルをインデックスしてSELECTを高速

    テーブルのおインデックス項目はSELECTすると検索が早いのですが、 インデックスではない項目をWHEREすると時間がかかります。 そこでテーブルカラム全部をインデックス化することでの メリット、デメリットは何でしょうか?

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

    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
  • 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でした。 よろしくお願いします。

  • 自分に合った英単語・熟語の本を探しています。

    自分に合った英単語・熟語の本を探しています。 TOEICの受験に向けて、自分に合った英単語・熟語の本を探しています。 家の本棚を探していたら、妻が持っていた「出る順単熟語(英検2級)、ジャパンタイムズ社編」の形式がとても使い易かったので、TOEICでも同じ形式のものがないか探しています。 ※以下出る順の形式です。 ・テキストは「単語」・「意味」・「例文」・「例文の訳」のカラムが分かれている ・音声付きで、「英単語(ネイティブ)」→「意味(日本語)」→「簡単な例文(ネイティブ)」の順番で流れる ・ABC順ではなく頻出順にソートされている 現在Z会の速読英単語(受験用)と、速読速聴coreを持っており、主に読解用に使用しています。 単語に注力するため、例文が短くシンプルなものを探しています。 本屋で上記と同じ形式の本が幾つかあったのですが、音声を確認できないため質問させて頂きました。 ご存知でしたら教えていただけますでしょうか。

  • 昇順と降順って・・・

    アルファベットのA->Zに向かうのは昇順でしょうか?それとも降順でしょうか? Yahooの辞書によると、 >しょうじゅん【昇順】 >単語などを五十音順,またはアルファベット順に配列する場合に, >ん→あ,Z→A の順で配列すること となっていますが、エクセルの並べ替えだと逆になっています。 どちらが正しいのでしょうか?

  • Microsoft wordについて

    こんにちは。中一の英語大好き人間です。実はこの間Microsoftwordを使って自分の分からなかった英単語をまとめた辞書を製作し始めたのですが、今になるともうぐっちゃぐちゃ。そこで思ったのですがまとめた単語をABC順に並び替えることのできる機能はMicrosoftwordにありますか?もしあれば教えてください。よろしくお願いします。

  • 単語の勉強について質問でございマッスル!

    みなさん!こんにちわ!!!!!!!!!! 僕早稲田を目指して今年から浪人なんですが、英単語の勉強について質問があります! 僕は単語の勉強を 速単必修、上級 の後ろにあるインデックスのところのabc順の単語を丸暗記しています。 単語の語彙数はこの速単必修、上級のインデックスのを全部覚えたら単語の勉強はもうしなくていいんですかね??他にも良書としてターゲットがありますけど、こっちの単語集も二冊目としてやったほうがいいですかね?

  • 中学生にお薦めの英単語学習教材

    小学6年生の子供を持つ親です。 現在の英語学習はNHKラジオ基礎英語1をテキスト通りに聞いて発音しているのみです。 文法、英単語の勉強はしていません。 文法は英単語は(公立)中学に入ってから、教科書に出てくる順番で覚えられればと思っています。 私が学習したウン十年前は、紙の英単語帳を作って、ひたすら覚えていましたが、今それをやるのは、とっても非効率的ではと思っています。一番のデメリットは、発音が聞けないことだと思います。 入学後にあわてないために、おすすめの(効果的な)英単語学習教材(英単語帳、CD、DS、電子辞書など)を教えてください。

  • コロケーションの本を探しています

    英語のコロケーションの単語帳・辞書などが欲しいのですが、コロケーションの頻用度に基づいた言葉の選択やレヴェル分けがされている本はありますでしょうか。 例えば「辞書を引く」「鉛筆を削る」といったものから「丸く収める」「後手に回る」など、日常よく使うものから「本では見かけるね」といったものまで、頻用度の高いものから順に学んでいけるものを探しています。 英単語自体ついては頻用度に基づいたリストや本はたくさんあるのですが…、よく使うコロケーションを集めた本というのはあまり見かけないもので。 もしありましたらぜひ教えてください。よろしくお願いします。

  • どんなインデックスを設定したら良いでしょうか?

    お世話になっております。 Windows2003Server SQLServer2000(SP4) を使用しています。 新しく作成したテーブルに、どのようなインデックスを設定したら良いか悩んでいます。 新規作成のテーブル:tableA カラム     主キー 型 規定値 説明 --------------------------------- ユニークNo   P   INT     ユニークなコード 大分類コード  P   INT     大分類マスタとリンクする 中分類コード  P   INT     中分類マスタとりんくする 代表フラグ       INT  0   0と1があり、1の方が優勢 やりたいこと: tableAからユニークNoが重複しないようにしてデータを取得する。 このとき、ユニークNoが重複している場合は、代表フラグ=1のデータを取得する。 ただし、代表フラグ=1のデータが複数存在する場合は、大分類コード、中分類コードの最若番のデータを取得する。 また、代表フラグ=1が0件で、代表フラグ=0が複数ある場合は、その中から、大分類コード、中分類コードの最若番のデータを取得する。 これを実現するために作成した取得用ストアド: SELECT   x.ユニークNo,   x.大分類コード,   中分類コード,   x.代表フラグ FROM   (SELECT     ユニークNo,     MAX(代表フラグ) AS 代表フラグ   FROM [tableA]   GROUP BY ユニークNo) AS z,   (SELECT     ユニークNo,     代表フラグ,     MIN(大分類コード) AS 大分類コード   FROM [tableA]   GROUP BY ユニークNo,代表フラグ) AS x,   (SELECT     ユニークNo,     代表フラグ,     大分類コード,     MIN(中分類コード) AS 中分類コード   FROM [tableA]   GROUP BY ユニークNo, 代表フラグ,大分類コード) AS y WHERE   x.ユニークNo = y.ユニークNo AND   x.大分類コード = y.大分類コード AND   x.代表フラグ = z.代表フラグ AND   y.代表フラグ = z.代表フラグ AND   x.ユニークNo = z.ユニークNo アドバイス、宜しくお願いします。