0
0

More than 3 years have passed since last update.

[MySQL]インデックスと本の索引の違いについて

Last updated at Posted at 2020-02-11
1 / 2

この投稿の経緯

インデックスはDBの初学者に、本の「索引」という2文字で説明されることが多い。
私も、その説明で何となく理解したつもりになっていたが、よくよく考えてみると「索引」ではインデックスを正確に理解することはできない気がしてきた(無知の知)。
「索引」と「インデックス」の2つを比較しながら頭の整理をしたメモ書き的な内容です。
認識が違っていましたら、コメントお待ちしております。
ここでは本の索引は「索引」、DBのインデックスは「インデックス」と呼びます。

索引

索引とは

引用元
https://www.weblio.jp/content/%E3%81%95%E3%81%8F%E3%81%84%E3%82%93

ある書物に載っている項目・人名・用語などを書き出して五十音順などに並べ、その所在ページなどを示した表。インデックス。

  • 本でいうページにあたるものが主キー
  • 索引の項目は1項目単位で表現

「大陸の生態系」みたいな本の索引のイメージです

image.png

インデックス

インデックスとは

  • インデックスの種類
    • インデックスのない状態: ページの順番がバラバラな本でしょうか?
    • クラスタインデックス: 本自身(「キー:ページ、値:本文」、一意のキーが連番で昇順に並んでいる)です
    • セカンダリインデックス: 索引です ※ALTERで作成するインデックスはこちらのことです
      • 単一列インデックス
        • 本の索引に近い(1項目単位の項目と該当する主キー(ページ)だけを持っている)のはこっち
      • カバリングインデックス 本の索引とは異なる(複数項目を組み合わせた単位の項目と該当する主キー(ページ)及び取得するべき全ての値を持っている)
        • 複合インデックス(予め組み合わせを作っておく)
        • インデックスマージ(複数の単一列インデックスがクエリ実行の際に合体、オーバーヘッドあり)

continentテーブルです

image.png

カバリングインデックスの定義だとこうなります
alter table continent add index (name, animal, fruit);

まとめ

索引は項目一つに対して一つまたは、複数のページを参照させるもの。
インデックスは、項目一つまたは、複数の項目の組み合わせに対して一つの主キーを参照させるもの。

インデックスについて調べるとクラスタインデックスとセカンダリインデックスを明示することなく単にインデックスと記載している記事、参考書が多くそこを理解するのに結構苦労しました。
インデックスが効いている言われるときのインデックスはセカンダリインデックスです。
セカンダリの中でもカバリングインデックスは取得項目を全てセカンダリインデックスのリーフブロックに保持しているので、わざわざクラスタインデックスを見に行かなくてよいので検索件数が減り検索が早いです。
索引で例えるなら、索引を見れば本文の内容までわかってしまうといったことでしょうか?
ちなみにフルインデックススキャンとはクラスタインデックスセカンダリインデックスのリーフブロックを全て見てるので検索が遅いです。

この様に頭をインデックスと索引の違いを整理すると、「索引」という例えは結構無理があるのかなと思いました。
とはいえ、「索引」の例えは良いアプローチだと思いますので、人に説明するときは、誤解の内容に「索引」という例えを使っていこうと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0