技術関連の覚書

案件でやったり自宅で試したことの覚書、自宅Redmineから移行

DBのインデックス

以前書いたSQLの最適化について( http://blog.hatena.ne.jp/boctok-ctpoba/boctoc1969.hatenablog.com/edit?entry=10328749687232910758 )ですが、「インデックスで検索速くなるなら全部につけちゃえばいいんじゃない?」と言う人がいたので補足します。

インデックスというのは、データの索引(Aで始まるとか)に分類してそれがどこにあるのかを示したデータです。

だから、これを作るときに負荷がかかります。

つまり、INSERT、UPDATE、DELETEの時はインデックスを作り直すためその分時間がかかります。

やたらとインデックスを貼れない理由はそこです。

それから、インデックスを貼る場合に効果があるかどうか検証した方が良いものもあります。

  • データの内容がほとんど変わらないもの

99%が同じデータで残りの1%に対する検索を殆どしない場合検索範囲は99%なので、あまり効果はありません。

  • データの種類が少ないもの

フラグのように2値だと検索量は良くて半分です。検索範囲が半分になる事で効果がある場合や、偏りがあって小さい側の検索が多い場合は有効かもしれません。

上記のような状態をカーディナリティが低いと言うそうです。

Google翻訳ではこの様に出てきました

cardinality the number of elements in a set or other grouping, as a property of that grouping. Cantor conjectured that there are no infinite cardinalities between the size of the natural numbers and the size of the real numbers (and so there are no sets S as described above).