kei-p3’s blog

kei-pによる技術共有と思考整理

データベース実践入門を読んでみた

購入のきっかけ

普段Webアプリケーションの開発をしているのだが、基本的に機能開発をすることが多く、細かなSQLのチューニングの仕方やインッデクスといったデータベースの知識に乏しく、不安がありました。

そんな中、データベースの設計についてググると「漢のコンピュター道」というブログを発見。
大変勉強になるなと感心してたら、なにやら本を出していたようなので購入。

勉強になったこと

本書では、

  • データベースは二次元テーブルではない。リレーションである。
  • データベースは数学(述語論理と集合)
  • 正規化
  • キャッシュやグラフのやり方

と幅広くデータベースの原理や、考え、実践方法を解説しています。

その中でもとくに、自分として悩んでいたインデックスによるチューニングについての解説が勉強になりました。

インデックスは貼ればいいだけじゃない!

インデックスで検索が早くなる理由は、B木 (wikipedia)にあった。

簡単に説明すると、B木では以下のように親の要素より大きいか、小さいかによって分かれて値が配置される。

f:id:kei-p3:20160705200617p:plain

するとインデックス内部では、事前にハッシュ化やソートされて格納されているため、 例えば、WHERE x < 10のレコードを探すときは、対象となる検索範囲が一部だけで済む。 インデックスの速さは、このB木によるアクセスによるものというわけだ。

f:id:kei-p3:20160705200620p:plain

そして、逆にこの仕組みがあるからこそ、不向きな面もある。

  • 貼ると遅くなることも。。。 (ハッシュ化されると範囲検索できなくなる)
  • enum や boolean のような種類の少ない値(カーディナリティが低い)にインデックスを貼っても効果が薄い
  • NULL はインデックス対象外
  • インデックスを貼ると、更新時のオーバヘッド、ディスクサイズの増大へ

今まで、インデックスを 貼る / 貼らない の区別をつけづらく、遅いクエリを見つけたら、インデックスが効くようにWHEREに含まれる絡むをマルチインデックスとしてやっていたが、フラグのような値を入っていたのでかなり無駄が多かったかもしれない。

いろいろ試す時間があればこの辺いろいろ検証できるんだけど、なかなかそれだけのための時間がとりずらいだけに、おろそかにし気味。。。
そんなときに本書のような解りやすい方針があるとかなり助かりますね!

まとめ

全般的に分かりやすく、リレーションや正規化の考え、インデックスのおおまかな仕組みが解説していたりと、原理から実践編へと話をつなげており分かりやすいかったです。まさにタイトル通り、「実践入門」でした。

しかし個人的には、1回流しで読んだ程度では、まだ正規化の章は完全に理解しきれてない(とくに第5、第6など)ので、再び復習しようかなと思います。

自分のようになんとなくSQLがかけるが自信がないような方々、是非読んでない方は読んでみるといいかなと思います。