skillup

技術ブログ

Database

データベースのインデックスについて

投稿日:

今回はデータベースのインデックスに関して。

検索条件を早くする場合、何よりも速度が速くなるのはインデックスを張ることでしょう。

インデックスを張ることは単語を索引順に並べることですので、劇的に速度が向上します。

他にも

  • アプリケーション(プログラム)での変更がなく、エンジニアが意識しなくてよい
  • データ自体には影響を与えない

などのメリットもあります。

デメリットは「索引用の内部データを作成しなければいけないため、更新時に若干時間がかかる」ことかと思いますが、メリットに比べると小さいです。

データベースで使われているインデックスは正確にはB-treeインデックスといわれているものです。

Btreeインデックスに関してはの説明はこちらを参考に。

Btreeインデックスが優れている点としては下記のような点です。

  • すべてのデータに対してだいたい同じ計算量でアクセスできること(長期間の運用では少しずつ崩れていく)
  • データ量nに対し、フルスキャンの計算量はlognであること
  • 長期間の運用による性能劣化が他のインデックスに比べて緩やか
  • データの構造上、統合だけでなく、不等号やBetweenに関しても高速化が利く(逆に否定にはきかない)
  • キーをソートしているため、集約関数、ORDER BY、集合関数に強い

具体的にはインデックスは下記のような場合にはると効果的と言われています。

  • またデータ量nに対して計算量がlognなため、データ量が少ないもの(目安として1万以下のレコード)には効果がない
  • カーディナリティの高いもの(データの種類が多いもの。例:顧客番号。逆にカーディナリティが低いものは性別。2種類しかないため。)
  • SQLで検索条件として使われている

逆にインデックスの効果がないものとしては下記のようなケースです。

インデックス列に対して算術演算を行うとき

インデックス列に対してSQL関数を使うとき

インデックス列に対してIS NULLを使うとき

インデックス列に対して否定形を使うとき

インデックス列に対してORを用いているとき

この場合INを使うほうがインデックスの効果はでます。

後方一致、中間一致のlike

前方一致のみが有効です。

暗黙の型変換

数値⇔文字や文字⇔日付を行った場合、エラーにはなりませんが、インデックスを使用することができません。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

外部結合について 行列変換

今回から外部結合について学習します。 これはCASE式でもやった集合の考え方が大事になってきます。 例えば下記のようなテーブルCoursesとがあるとします。 name | course &#8212 …

no image

ER図作成ツールについて(Mac版)

ER図作成ツールについてMacで色々と調べましたので、メモを。 フリー限定で。 ちなみにwindowsを使っていればA5:SQLが一番使えるかと思います。 以前も下記リンクで説明させていただきました。 …

no image

浮動小数点に関して

金額計算なんかでfloatを使うと誤差が出るっていうのは基礎的な話ではありますが、背景知識を含めて理解しておこうと思ったのでメモります。 Contents1 float,doubleでの誤差2 金額の …

no image

CASE式のすすめ その2

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。 Contents1 CASE式の利用2 UPDATE文のCASE3 テーブル同士のマッチング CASE式の利用 私自身はCHECK制約を使 …

no image

DBの構造について メモリとHDD

データベースについてまたまた学習中。 覚えておきたいポイントなど。 データを収めておくべき媒体では「記憶コスト(単位金額当たりの容量)」と「アクセス速度」の2つが重要なパラメータ メモリとHDDでは前 …

アーカイブ