育児本を購入しに行った書店で見つけた「理論から学ぶデータベース実践入門 – リレーショナルモデルによる効率的なSQL」という本の読書logの続きです!
私の備忘録として、勉強になった内容と個人的な感想をまとめています。
あくまでも備忘録なので、詳しく勉強したい方は実際に書籍を手に取ってみてください🙇♀️
※イタリック体の文字は私の感想です。
第11章 インデックスの設計戦略
- RDBのインデックスはB+ツリー構造になっており、リーフノードとノンリーフノードで構成される。
- B+ツリーインデックスは左側から順にインデックスを指定する必要がある。
- 等価比較と範囲検索が利用できるが、LIKEの場合は前方一致に限られる。
- 複合インデックスの場合は、左側のカラムからの一致で絞り込まれる。
- インデックスの更新はリーフノードに対するエントリの削除と挿入処理が必要になるので、コストが高い。
- B+ツリーインデックスは左側から順にインデックスを指定する必要がある。
→インデックスの仕組み自体をしっかり勉強したことがなかったのですが、奥が深そうですね。LIKEではなぜ前方一致のみ有効なのかや、なぜインデックスを貼り過ぎると処理が遅くなるのか、などを理解することができました。
- B+ツリーインデックス以外にも、ハッシュインデックス・全文検索インデックス・Rツリーインデックス・関数インデックス・ビットマップインデックス・クラスタインデックス、などがある。
→MySQLのInnoDBでは全てのテーブルでクラスタインデックスとして作成されているとのことなので、主キー検索がメインになるように設計をしたいですね。
- インデックスの設計の流れ
- DBの論理設計を実施する。
- テーブルの正規化を実施する。
- テーブル内にNULLが極力含まれないようにする。
- クエリを記述する。
- インデックスを検討する。
- 対象とするカラム例
- WHERE句で等価比較や範囲検索の対象になっているカラム
- JOINのON句で利用するカラム
- 相関サブクエリで駆動表との比較に利用するカラム
- ソートに利用するカラム
- 注意点
- カーディナリティが高いカラムの方が効果が高い。
- 不要なインデックスや、効果が低いインデックスは作成しない。
- テーブルのサイズや、クエリの実行頻度も考慮する。
- 完璧を目指すのではなく、ある程度効果が出たところで妥協することが大事。
- 運用しながらインデックスを調整することも重要である。
- 対象とするカラム例
- DBの論理設計を実施する。
→クエリよりも先にインデックスを検討する事例を幾度と経験しているので、今後は上記の流れをチーム全体に浸透させていこうと思いました。インデックスの有無で検索結果が変わらないので。
第12章 Webアプリケーションのためのデータ構造
- 膨大なアクセスが想定されるWebアプリケーションの場合は、キャッシュの利用を検討する価値がある。
- キャッシュは、消失しても問題がないデータが前提であることや、大元のDBの更新が反映されていない可能性があることを理解する。
- キャッシュによる高速化の効果と、処理の複雑化のトレードオフであることを理解する。
- キャッシュの実装方法
- NoSQLを、RDBのキャッシュとして併用する。
- RDBにて、キャッシュ用のテーブルを作成する。
- 集計処理やテーブルの結合処理などで大きな負荷が想定される場合に有効。
→RDBにて実現する方法に関しては、クエリやトリガの例が書籍内に記載されていて、非常に参考になります。
- 1台のDBサーバでは処理能力が不足している場合は、レプリケーションやシャーディングの利用を検討する価値がある。
- レプリケーションはマスタとスレーブの同期に課題があり、シャーディングはDBサーバを跨いだデータ処理に課題がある。
→シャーディングは馴染みのない単語だったので勉強になりました。どちらも、威力を発揮するかはシステムの要件によると思いました。
ここまでの感想
インデックスは、どのように設計するべきかだけではなく、インデックスの基本的な理論も解説されていたので、あるべき設計の根拠も理解することができました。
非常に勉強になる章です。
キャッシュに関しては、キャッシュ用テーブルを用意する方法は、業務に取り入れやすそうだと感じました。
解説されるとごく当たり前てなんということはないのですが、自力では考えつくことや気づくことが難しい場合も多々あるので、外部から知識を仕入れることの大切さを実感しました。
以上