spangled shalalala blog

諦めたらそこで試合終了だよ。

【書評】GWを使って「失敗から学ぶRDBの正しい歩き方」を読みました

f:id:brokenspeaker888:20161013124806p:plain

目的

最近、仕事でクエリチューニングなどをする必要がある業務を行ったのでそれをきっかけに個人的にインフラやDB周りに興味を持ちました。
私自身は普段はアプリケーションエンジニアとしてサーバーサイドの開発を行っているのですが、大規模データの集計などを業務で行う際や新しいテーブルを作る際に、どういうカラム構成にしたらいいんだろう?なんて考えることもあり、それは基本を知らないからだと考えこちらの書籍を読んで基礎を身に着けようと思いました。
読了した感想を書評として、まとめておきます!

要約

  • DBのパフォーマンスや仕組みについて学びたい人、実務で目次にあるような悩みを抱えている人が読むと学びが多いと思う
  • これまではあまりテーブル設計などに自信がなかったが気をつける勘所を知ることができたので他の書籍なども含めて実力を付けれる内容
  • SQLアンチパターンと合わせて読むと効率が良さそう

この本に関して

この本は全20章の章立てになっており、各章が 1. アンチパターンの解説 2. 各アンチパターンに関連する要素の説明 3. アンチパターンを生まないためには 4. アンチパターンのポイント

と実務で起こりうるアンチパターンを元にわかりやすく開設されているし、各章がコンパクトにまとまっているのでテンポよく読むことができました。
アンチパターンの解説は会話形式になっていて、「うわー。あるある。。。」みたいな感じ。

目次

第1章 データベースの迷宮
第2章 失われた事実
第3章 やり過ぎたJOIN
第4章 効かないINDEX
第5章 フラグの闇
第6章 ソートの依存
第7章 隠された状態
第8章 JSONの甘い罠
第9章 強過ぎる制約
第10章 転んだ後のバックアップ
第11章 見られないエラーログ
第12章 監視されないデータベース
第13章 知らないロック
第14章 ロックの功罪
第15章 簡単過ぎる不整合
第16章 キャッシュ中毒
第17章 複雑なクエリ
第18章 ノーチェンジ・コンフィグ
第19章 塩漬けのバージョン
第20章 フレームワーク依存症

印象に残った章

各章がコンパクトにまとまっているおかげですべての章が勉強になる感じが満載でしたが、特に印象に残った章を挙げるとしたら「第4章 効かないINDEX」「第11章 見られないエラーログ」「第13章 知らないロック」「第15章 簡単過ぎる不整合」あたりでしょうか。

本の紹介となっている著者のスライドでも概要が読めるのでおすすめです。
https://speakerdeck.com/soudai/learn-from-failure-1

「第4章 効かないINDEX」

この章のポイントはINDEXです。漠然としか雰囲気をわからなかったINDEXについて仕組みから説明されているのでわかりやすい。
また、INDEXをつけているはずなのに遅い、みたいな場合のアンチパターンを例にどの場合にINDEXが使われ、その場合に使われないのかというのが解説されています。
例えば、この章で解説されているINDEXが使われないケースは

  • 検索結果が多い、全体の件数が少ない
  • 条件にその列を使っていない
  • カーディナリティの低い列に対する検索
  • あいまいな検索
  • 統計情報と実際のテーブルで乖離がある場合

とされています。カーディナリティの部分などはあまり具体的には知らない内容だったので勉強になりました。

また、闇雲にINDEXを貼って対処する「インデックスショットガン」もアンチパターンとして紹介されており、将来的にどの程度のレコード数になるのかを考えながらテーブル設計を行う重要性を感じました。

「第11章 見られないエラーログ」

この章でエラーログの監視についてのご紹介となっております。
エラーログについては私自身もいろいろと業務で監視しなければいけないものがあり、わかりみがすごい...

エラーの通知を飛ばすのはいいけど、どの部署が見るべき通知なのかがわかりにくかったり、そもそも通知の量が多すぎてオオカミ通知になっていたり、誰かが見るだろうと放置されてしまったりといろいろと悩みが多い問題です。

そのため、通知をログのレベル別で分けたり、Slackへの通知やRedmineへの起票の自動化などのTipsも紹介されていて便利そうだと思いました。
また、Elasticsearchを使ったログの可視化なども紹介されており、隔週程度でチームでまとまって振り返りをする時間を取るなどの取り組みは非常に良さそうなので自分の業務でも取り入れていきたいです。

「第13章 知らないロック」、「第14章 ロックの功罪」

自分は恥ずかしながらロックについて十分な知識があるとは言えないのですが、この章を読んで今までわかっていなかった部分がすっきりしました。
まずRDBMSごとにロックの仕組みは違っており、安易に「あのDBではこのやり方だったから、今回もこのやりかたでいこう」みたいなノリが通用しないということ。

これは各RDBMSのドキュメントを読み、仕組みを理解する必要があるという重要性を認識できました。 また、パフォーマンスが改善するからといって安易にトランザクション分離レベルの設定を変更すると並列処理の場合に正常な動作が行われず、不整合につながるということも知りました。

14章ではACID特性、トランザクション分離レベルを中心に話が展開されるのですが、ここらへんも自分の知識不足で知らないことが多かった... 参考文献としてはここらへんの資料がわかりやすかったです。

またトランザクションやACID特性について以前まとめた記事はこちら

「第15章 簡単過ぎる不整合」

この章はアプリケーションに機能を追加する際に新しいテーブルを作成せず、既存のテーブルにカラム追加でお手軽に済ませようとした結果、どんどん要件が複雑になり最後には負債を残してしまう結果に...
しかし、これも実務ではあるあるなパターンなので気をつけなくては...

アンチパターンのポイントで述べられているように

RBDは正規化に始まり正規化に終わるといっても過言ではありません

これは名言だ... 😇

非正規化は基本的に行わず、必要になったタイミングではデータベースの設計に問題がないか、ほかの代替手段はないかをよく検討してください。多くのケースの場合、テーブル設計の見直しやキャッシュ戦略などで解決します。

とある通り、非正規化よりも他の解決策を考えるほうが技術的負債を抱えずに済み、アプリケーションの成長と企業の成長に寄与できるのだと考えさせられました。

本書の中でおすすめされていた書籍

この本自体がオライリーSQLアンチパターンを読んでいることを前提にされているほか、「理論から学ぶデータベース実践入門」SQLパフォーマンス詳解」がおすすめされていたのでこちらの書籍も読んでみたい。
まずは本著でも何度も紹介されていたオライリーSQLアンチパターンを次は読んでみよう。

まとめ

実務でのあるあるを例にしているので非常に読みやすかったですし、また各章がコンパクトなのでテンポよく読めた。
DBやインフラに興味を持ち始めた私のような人が読むといろいろと基礎力が身につけられてちょうどいいかもしれない。
また、本著で紹介されているSQLアンチパターンなどの書籍をこれから読むことでよりデータベース設計・テーブル設計の基礎力を身につけていきたいなと思います!

以上、「失敗から学ぶRDBの正しい歩き方」の書評でした!