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

SQL 更新系に関して

SQL実践入門、残り2章になりましたが、いやーむずいっす。 今回は9章を進めていますがSQLはもともと検索を主な用途として発展したため、SELECT文の使用がメインになります。 ですが、UPDATE文 …

no image

データベース設計のアンチパターン 複数表結合,大作SQL,Blob型の乱用

データベースのアンチパターンに関して。 以前下記ブログでも書いたんですが設計のスキルに関してもう少し身に着ける必要があるとおもい、チェックします。 論理設計のグレーノウハウ サロゲートキー 論理設計の …

no image

DBUtils活用

普段はJavaEEで開発を行っているのでデータベースへのアクセスはJPAを活用しています。 ただ、JavaEE環境だとglassfish経由でデータベースを動かしているので、glassfishを動かさ …

no image

ユニークキーの設定

MySQLでのユニークキーの設定に関して。 ユニークキーの設定は下記の通り。

ユニークキーを作成した後に確認するのは下記コマンドで。 …

no image

第二、第三の正規化&ER図&Check制約

前回第一正規化を話したので、第二、第三に進んでいきます。 Contents1 第二正規化とは?2 第三正規化とは?3 正規化のメリット4 ER図5 本日のSQLネタ Check制約 第二正規化とは? …

アーカイブ