SQLパフォーマンス詳解 を読んだ

どういう本か

データベースのインデックスについて解説している本。Bツリーインデックスの内部構造、効率よくインデックスを使う方法、実行計画の見方などが書いてある。Oracleデータベースの用語を使って書かれているけど、「原理は他のデータベースにも同じように適用できます。」と書いてあった。

この本はWeb上で無料で読めますが、私は9.95ユーロでPDFを買って読みました。

いいところ

インデックスの内部構造の説明が最初の章にある

これを頭に入れてから、それでは実際のSQL文においてインデックスがどう使われるでしょうか?という以降の文章を読むとスッと入ってくる感じがした。

視野が広がった

この本はOracleデータベースを基本として書かれている。自分はMySQLの知識しか持ってないので知らないことがいろいろ出てきて視野が広がった。例えば以下のようなことを初めて知った。

  • カラムに関数を適用した結果にインデックスを張ることができる
  • 条件にマッチする行だけを含むインデックスを作れる
  • 結合処理(JOIN)のアルゴリズムが3つある。それぞれによって最適なインデックスは異なる
    • 入れ子ループ(nested-loop join)
    • ハッシュ結合
    • ソートマージ
  • Oracleの実行計画を表示するとPredicate Information(述語情報)というのが表示される
    • ここにはインデックスに適用する条件が書かれていてアクセス述語とフィルタ述語というのがある
    • アクセス述語はインデックス走査の範囲を絞るための条件
    • フィルタ述語はリーフノードを読み取ったあとに適用する条件
    • MySQLではアクセス述語はEXPLAINの結果のkey_len列を見る。フィルタ述語は2つに分かれていて、インデックスフィルタ述語はExtra列のUsing index condition (MySQL 5.6以降)、テーブルレベルのフィルタ述語はExtra列のUsing whereを見るとわかるとのこと
  • コスト値
  • インデックスを使った group by のアルゴリズム

書いてみたらたくさんあった。

まとめ

MySQLのインデックスに関する知識はインターネットで「MySQL インデックス 入門」とかでググると素晴らしい解説がいろいろ見つかるのでそれで勉強してもいいと思いますが、それよりもう少し詳しく知りたい人は読むと得るものがあるかもしれません。私はありました。

おまけ。この本を読んでいるときに INDEX FULL SCANを狙う - MySQL Casual Advent Calendar 2011 - SH2の日記 を読んだら「わかる...わかるぞ!」という気持ちになって楽しかったです。