情報システムやWebサイトにてデータベース(ここではDBMS)を使用する意義は様々ありますが、主な役割は"必要な情報を整理された形で高速に取り出す機能"になります。

ひとえにデータベースが単なるファイルと異なる点は"インデックス"が使用できるところにあります。

インデックスはその名の通り、ドキュメントの見出しや目次のことですが情報量が増えれば増えるほどその効果が高まります。

例えば以下のような不規則なデータの集合があったとします。
poiuytrgewqlkjhgfdsamnbvcxzaqwertyuioplkjhgfdsmnbvcxzasdfghjklqwertyuiop
この中から"g"という文字の出現回数を数えるには先頭から一文字一文字注意深く観察する必要があります。

この情報が以下のようにアルファベット順に整列していた場合はどうでしょうか、aaabbccdddeeefffgggghhhiiijjjkkklllmmnnooopppqqqrrrssstttuuuvvwwwxxyyyzz
あっと言う間にgが4個あることがわかりますよね。

このようにあらかじめデータの整列を(実際には論理的に)行い、検索時にデータを瞬時に取り出せるような仕組みがインデックスの主な役割です。なお、利用者が数百万人、数億人いるようなSNSサイトであっても瞬時に自分のプロフィールを呼び出して認証を行ったり、変更を行えるのもインデックスが有効に機能しているからです。

しかし、これだけデータベース活用に重要であるにも関わらず、システム開発において中心となるプログラマの中にはデータベースのインデックスについて関心(あるいは興味)やスキルが不足している人が比較的多いという残念な現状があります。開発時や運用初期段階ではデータ件数も少なく、また無理な工期も少なくなくデータベース性能にまで気が回りにくい状況もあるのでしょう。

データベースを運用して数年も経ってから、「最近どうもデータベースのレスポンスが遅い」という現象が発生し、詳細に調査を行ってみたら必要なインデックスが設定されていなかった、なんてことにもたびたび遭遇します。この時きちんとした技術者であれば原因の一つとしてインデックスの不備が思い浮かびますが、安易に「サーバ性能が足りないから」と判断してメモリやCPUの増強を提案される場合も多いです。

私の経験的にはデータベーストラブルの7割以上がインデックスの不備によるものです。

私はインデックスに不備がある状態をお客様に説明する際には「でたらめに本が並べられた本屋で必要な本を探し求めることを想像してみてください」と伝えます。欲しい本が比較的簡単に見つかったり"無いこと"がわかるのは書店の店員がキチンと分類を行い、部分的にあいうえお順に並べてくれるからです。たまに、特に気にしていないと思われる本屋があったりしますが、我慢できるのは商店街にあるような小さな商店までですよね。