インデックスショットガン

インデックスの性質を理解して、闇雲にインデックスを作成したり、逆に全く設定しないということのないように、というもの。そりゃそうだ。
ただ、解決策に示されているのは、すでに運用中のデータベースに対するパフォーマンス改善としてのインデックスの作成であり、いわゆる物理設計としてのインデックス設計とはちがう。そして、設計段階でのインデックスの設計は意外と難しい。なぜなら、今のデータベースはコストベースのオプティマイザであるため、実際のデータの分布がわからないと、そのインデックス自体が有効か有効でないか?ということがわからない。
このため戦略としては、インデックスが使用される可能性が高い場合のみ設定するように設計するか、多少低くても設定するように設計するか、のいずれかがある。前者は運用中のパフォーマンス改善を行いつつ、必要なインデックスのみ設定していくというもの。後者は多少インデックスが無駄になっても仕方がないが、運用中のパフォーマンス改善の機会をあまり持たなくても良いようにするというもの。運用後に必要となるインデックスが途中で変わる可能性も考えられるからである。
さて、理想としては前者だろうが、後者を選択せざるを得ない機会も多い。とくに、設計担当者が最後まで残っていない場合などは、可能性のあるものをつけておく、というのはひとつの戦略であろう。定期的に遅いSQLをピックアップし、パフォーマンス改善が行える会社であれば、何も気にする必要はないのだが。

低選択性のインデックスというコラムについて

アンチパターン自体は特に議論の余地はないのだが、このコラムはすごく引っかかる。というのも、原著はとくに問題ないと思うが、監訳者の追記が引っかかる。

このコラムで述べられている選択性の定義と計算式はMySQL特有のものと思われます。

本当だろうか?そんなことはないように思うのだが。選択性(selectivity)とは以下のようなものであると本書では述べている

MySQL テーブルの総行数に対するインデックス中の個別の値の数の割合
そのほかのRDBMS テーブルの行の総数に対し、抽出条件を適用した結果の行数が占める割合

例を挙げるとすれば、Bugsテーブルが10,000件あり、その中の属性であるstatusが5種類あり、仮にそれぞれ均等分布していた場合は、

MySQL 5 / 10,000 = 0.5%
その他のRDBMS (10,000 / 5 ) / 10,000 = 20%

となり、以下の様に結論づけている。

上記コラムでは「選択性が低いと、インデックスの有効性も低下します」と述べていますが、MySQL以外のDBでは正反対であり、「選択性が高いとインデックスの有効性が低下する」ことになります。

あれ?本当かな?「選択度が高い=インデックスの有効性が高いと思っていたが」ということで、本書の参考URLをいくつか参照して調べてみよう。

Firebird

上記のような説明があるのだが、Selectivityはインデックスの統計で計量化できるとある。インデックスの統計は上記のような計算式なのだが、Selectivityが高い=インデックスの統計値が高いとは言っていない。

Postgresql

selectivityを計算しているが、これは、「テーブルの行の総数に対し、抽出条件を適用した結果の行数が占める割合」である。ヒストグラムを使っているので少しわかりにくくなっているが、言っていることは同じである。
ただ、selectivityが高いからインデックスの有効性がどうといった表現はどこにもない。

SQL Server

選択度とは、特定される行の、合計行数に対する比率です。比率が低い場合、インデックスの選択度は高くなります。

この説明の前半は本書と一致しているようだが、実は違う。つまり、この比率が低ければ、選択度が高いと言っている。比率と選択度の関係は逆だということがわかる。

Oracle

「セレクティビティが低いとデータが絞り込みやすくなるため、索引が使用されやすい」といっているので、本書の主張と同じになっている。
ただ、これはOracleコンサルタントが作った資料なので、念のためマニュアルで確認してみる。
Oracle Database パフォーマンス・チューニング・ガイド 11g Release2の「14.1.3 索引をつける列と式の選択」にはこうある。

・選択性の高い索引キーを選択します。索引の選択性は索引付けするキー値と同じ値を持つ行が表に含まれる割合です。

「14.1.4 コンポジット索引の選択」には以下のようにある。コンポジット索引とは複数属性の索引のことである。

・選択性の向上
選択性の低い複数の列または式を組み合わせることで、選択性の高いコンポジット索引を作成できる場合があります

結論

「選択性が高い=インデックスの有効性が高い」という原著の主張が正しいと思う。