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の結合では自己結合という考え方があります。 下記のようなテーブルProductsがあるとします。 name | price ——&# …

no image

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

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

no image

JPAでのデータベースとの同期

このブログでも何回か書いてきたJPAですが、新規レコードをインサートさせた際IDを取得し、そのIDをもとに何らかのキーを作る、そういう処理があったので紹介させていただきます。 何回か書いてますが、JP …

no image

postgresの外部キー制約やcascadeについて

外部キーを貼っておくと、当然、削除などを行うときにエラーになり、truncateも当然できなくなりますが、cascadeをつけることで、関連するテーブルまで一気にtruncateされます。 [cray …

no image

slow-query-logについて

データベースを伴う部分でののチューニングですが、大きく分けると SQLを書き直す インデックスを張りなおす プログラム内部でキャッシュを有効化する 設定ファイルの修正 上記のようなかんじになるのではな …

アーカイブ