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を受け取って処理を実行する前には下記のような段階があります。 Contents1 パーサー2 オプティマイザ3 カタログマネージャー4 参考リンク パーサー SQL構文のチェックし …

no image

データベース設計のアンチパターン 重すぎるOLTP+Date型不統一+データ量想定が甘い

Contents1 重すぎるOLTP1.1 デメリット1.2 対策2 DATE型の型の不統一2.1 デメリット2.2 対策3 データ量の想定が甘い3.1 デメリット3.2 対策 重すぎるOLTP ※O …

no image

MySQLの大文字、小文字問題について

MySQLでテーブルを作る際にカラムに重複を許さない制約(unique)を振ることがあると思います。 数字の場合は問題ないのですが、文字列の場合、なんと英語の大文字と小文字が区別されません。 つまりa …

no image

浮動小数点に関して

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

no image

MySQLのレプリケーションについて

MySQLのレプリケーションについて調べたことなどを。 Contents1 レプリケーションの基礎知識1.1 定義1.2 構成1.3 メリット1.3.1 参照性能の向上1.3.2 可用性の向上1.4 …

アーカイブ