データベースの処理速度を向上させる?初心者が分かりそうでわからないインデックスとは
データベースは、年々その需要が高くなっています。 一昔前は、多くの企業サイトは「名刺代わり」としての役割だけを担ってきました。 そのホームページを見た人が 「サイトを作っているちゃんとした会社」 として認識してくれるだけで良かったのです。 しかし、現在サイトに求められているのは 「いかに集客に活用できるのか」 「いかに顧客満足度を高められるのか」 「いかに成約に繋げられるのか」 です。 そのため、多くのサイトで「顧客情報を集める」ための仕組みが導入されています。 その他、販売管理や商品管理など、様々なデータを企業内で扱う機会は増え、それとともに 「データベースを管理する人」 も増えてきました。 そんなデータベース管理者の基本的な知識として 「インデックス」 があります。 今回はこのインデックスについて見ていきましょう。
データベースにおけるインデックスとは?
データベースにおけるインデックスとは?[/caption] データベースにおけるインデックスとは、テーブルへの検索処理を高速化させるものです。 インデックスは「探すレコードを識別するデータの項目」と「対象レコードの格納位置を示すポインタ」の2つの情報で構成されています。 この2つの情報を用いてデータの格納位置を特定し、その位置に直接アクセスする事で、検索処理を高速化させています。 例えば、以下のようなテーブルがあったとします。
表1
ID | 名前 | 所属部署 | 入社年月 |
---|---|---|---|
1 | Cさん | 営業部 | 2020/10 |
2 | Aさん | 営業部 | 2021/11 |
3 | Eさん | 営業部 | 2020/07 |
4 | Dさん | 技術部 | 2018/10 |
5 | Bさん | 技術部 | 2020/08 |
もし、SELECT文を用いて名前のカラムから値を検索したいとします。 上記の表をそのまま用いて、検索処理を行うと余計な時間が掛かってしまいます。 所属部署や入社年月のような必要のない情報が含まれているからです。 しかし、上記の表の中からIDと名前のみを抽出した以下の様なテーブルを作成することにより、余計な情報を操作する必要がなくなるので検索時間が短くなります。
表2
ID | 名前 |
---|---|
2 | Aさん |
5 | Bさん |
1 | Cさん |
4 | Dさん |
3 | Eさん |
これがインデックスが検索における処理を高速化させている大まかな仕組みになります。 これは余談ですが、インデックスを日本語にすると索引という意味になります。 辞書や百科辞典で索引がなかったら、目的の情報にたどり着くまで1ページずつ見ていく必要がありますが、索引があれば一発で目的のページにたどり着くことが出来るでしょう。 データベースにおけるインデックスも同様の物というイメージを持つと分かりやすいでしょう。
データベースにインデックスを作成するメリットについて
データベースにインデックスを作成するメリットについて[/caption] インデックスを作成するメリットは、大きく分けると2つあります。 ・データ抽出の高速化 ・ソート作業の省略化 ここて注意しなければいけないのは、どちらもデータベースからデータを抽出する時の処理であるという点です。 通常、データベースの処理といえばCRUD(Create, Read, Update, Delete)の4つが一般的です。 インデックスはあくまでも上記4つのうちのR(Read)に対して効果があるということになります。 それでは、先程挙げた2つのメリットについて解説していきましょう。
データ抽出の高速化について
インデックスを貼るとデータベースにおける全ての処理が速くなるという訳ではありません。 まずは、処理が速くなるケースについて解説していきます。
WHEREによる絞り込み
インデックスにより処理速度が速くなる条件の1つめは、SELECT文に対してWHEREで条件を付ける時です。 例文としては、以下の通りになります。 SELECT カラム FROM テーブル WHERE ID = 4;
JOINによる結合条件
インデックスにより処理速度が速くなる条件の2つめは、SELECT文に対してJOINで結合条件を付ける時です。 SELECT カラム FROM テーブル1 JOIN テーブル2 テーブル1.ID = テーブル2.ID;
ORDER BYによる絞り込み
インデックスにより処理速度が速くなる条件の3つめは、SELECT文に対してORDER BYで条件を付ける時です。 SELECT カラム FROM テーブル ORDER BY ID;
データベースにインデックスを作成するデメリット
データベースにインデックスを作成するデメリット[/caption] データベースにインデックスを作成することはメリットだけではありません。 そこで、この章ではインデックスのデメリットについて解説します。
インデックスを作成する領域が必要になる
インデックスを作成するデメリットとして、インデックスを作成するための領域が必要になるという点です。 つまり、先程の章で例に挙げた表2を保存しておく領域が必要になるということです。 インデックスを作成するに当たりこのディスク領域を設計に考慮していないと、パフォーマンスが低下したり、インデックス操作が失敗します。 また、インデックスを操作するコマンドに関しては以下の通りです。 〇作成のコマンド CREATE [UNIQUE | BITMAP] INDEX <インデックス名> ON <テーブル名>(列名 [ASC|DESC],…) [TABLESPACE 表領域名]; ※UNIQUE→通常のINDEXを作成 ※BITMAP→BITMAP INDEXを作成 ※TABLESPACE→INDEXを作成する表領域を指定 〇再作成のコマンド ALTER INDEX <インデックス名> REBUILD ONLINE; 〇削除のコマンド DROP INDEX <インデックス名>;
インデックスを貼ると遅くなるパターン
インデックスは、検索における処理を高速化させると説明してきました。 注意しなければいけないことは、データの登録と変更、削除の際に、索引変更のためのオーバーヘッドが加わるため、インデックスがないテーブルに比べると時間がかかるということです。 INSERT UPDATE DELETE いずれのコマンドにおいても 「本来のテーブルに加えて、インデックスの表のデータも登録/編集/削除しなければいけません。 そのため、インデックスのあるテーブルよりも遅くなる可能性があります。
データベースでインデックスを用いる注意点
データベースでインデックスを用いる注意点[/caption] データベースでインデックスを用いる際の注意点は、インデックスを作成することによりユーザーの満足度が上がるケースと下がるケースの2パターンあるという点です。 それぞれのケースについて解説します。
インデックスを作成した方が良いケース
インデックスを作成した方がよいケースは、以下の通りになります。 ・データ量が多いテーブルの1%~15%程の行を頻繁にアクセスする場合 ・WHEREを用いた条件付き検索が頻繁に使用されている列である場合 ・カラムの値が比較的一意である場合 ・外部キーになっている列である場合 これらの場合には、インデックスを作成することで検索するスピードが速くなる可能性があります。
インデックスを作成しない方が良いケース
インデックスを作成しない方がよいケースは、以下の通りになります。 ・データ数が少ないテーブルである場合 ・列内の値がほぼユニークである場合 ・NULL値が多く、NULL以外の値を検索しない場合 これらの場合には、インデックスの効果はそれほど高くないでしょう。 また、 「どの項目もよく検索されるから」 という理由で、すべてのカラムにインデックスを付けてしまう事もおすすめ出来ません。 前述したように、インデックス用のテーブルに取られる領域が大きくなる関係上、結局検索速度が上がらない・・・という可能性があります。
インデックスの設計について
インデックスの設計について[/caption] 次に、インデックスの設計について見ていきます。
インデックスの種類
インデックスには、代表的な種類として、以下の3種類があります。
Bツリーインデックス
Bツリーインデックスは、データベース上に存在するバラバラのページ間を素早く検索するための構造のことです。 Bツリーとは、「バランス検索木」という言葉を略したものです。 そのため、Bツリーインデックスは、データベースを木の幹や枝の構造の様にデータベースを整理している構造であるということも出来ます。
ビットマップインデックス
ビットマップインデックスは、検索に用いられるカラムに対して、その値とレコードとのビットマップを使ってレコードを検索するインデックスのことです。 ビットマップインデックスが有効なのは、検索するカラムの取りうる値の種類が少ないときになります。
ハッシュインデックス
ハッシュインデックスとは。キーとなる値に対してハッシュ関数を実行して得られた結果のハッシュ値によって、インデックスを検索するインデックスのことです。 検索の際には、キー値をハッシュ化して導き出された場所に直接アクセスすることが出来ます。
インデックスの設計方法
インデックスの設計を行うにあたり、大切な点はどのカラムにおいてインデックスを作成するのかという点です。 状況にもよりますが、インデックスを作成するべきカラムは、以下の通りです。 ・WHEREで条件を付けられる頻度が高いカラム ・データ自体はたくさん入っているが、取得対象になるデータが少ないカラム ・カーディナリティが高い列(Bツリーインデックスの場合)、カーディナリティが低い列(ビットマップインデックスの場合) これらのカラムに関しては、インデックスを作成することにより、検索速度を上げることが出来ますが、それ以外の状況ですとデータベース全体の処理速度が下がる可能性があるので、その点に注意して設計を行いましょう。
データ管理の相談はAMELAに
データ管理の相談はAMELAに[/caption] 今回は、データベースを扱う上での基本的な技術であるインデックスについて見てきました。 インデックスは、検索速度を早める際に最も最初に考えられる項目の一つでしょう。 しかし、理解していない人が設定してしまうと、かえって時間がかかる様になってしまいます。 特に、数千万件以上のデータを扱うようなケースでは、それ自体が致命的な速度低下を招く可能性もあるため、注意が必要でしょう。 また、ビッグデータがビジネス活用として注目されるようになっていることからもわかるように、企業で扱うべきデータ量は年々増えています。 だからこそ 「ただたくさんデータを持っている企業」 から 「たくさんのデータを集積し、それを活用できる企業」 が、より高い実績を上げることが出来ると考えられます。 ・どのようにデータを活用して良いのかわからない ・データを集める方法が合っているのかわからない ・効率的にデータを集める仕組みがわからない 是非、ちょっとしたご相談でも良いので、AMELAにおっしゃって頂ければと思います。 専門のITコンサルタントが、御社に最適な提案をします。