ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

「Webエンジニアのためのデータベース技術[実践]入門」を読んだ

はじめに

Webエンジニアではないですが、仕事でDB使うようになったので、読みました。

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

ざっくりいうとどんな本?

データベースを今まで触ったことないひと向けに、データベースはなぜ必要か、そしてどういった特徴があるかを教えてくれます。著者が詳しいこともあり、対象はMySQLベースですが、内容はMySQLに閉じないと思います。データベースに関わることになったけど、正直さっぱりわからない、というひとが最初の1冊に読むととてもいいと思います。データベースまわりの全体像が把握できて、今後の学習の質がグッとあがる、良書です。

それでは、内容を振り返っていきましょう。

第1章 データベースがないと何が困るのか

Webアプリケーションを中心として、あらゆるシステムは「データ」を扱います。そのデータはどのように扱われるでしょうか。排他制御、クラッシュ時のリカバリ、検索性能といったものが求められます。データベースがないと困るんだよ、ということをまずはじめに知っておくことは重要ですね。

第2章 インデックスで高速アクセスを実現する

データを高速に検索するためのインデックスの概要と実装についての章です。B+Treeインデックスがよく使われてるようですね。

第3章 テーブル設計とリレーション

テーブル設計の例と、正規化について扱っています。本書でも紹介されてますが、この力を試すならデータベーススペシャリスト試験がいいみたいですね。

もっぱらインフラレイヤーでアプリ実装をしないのでデータモデリング、テーブル設計をする機会がないですな。。。

第4章 SQL文の特徴とその使いこなし方

SELECTやUPDATEなどのSQL文の説明です。また、SQL文の実行効率を確かめるためのEXPLAINについての説明もあります。

個人的にSQLは習得そんなに容易ですかね?結構難しい気がします。。。

第5章 可用性とデータの複製

ストレージレベルの冗長化(RAID)から、DBレプリケーションの一般的な構成について説明されてます。

双方向レプリケーション、すなわちマルチマスタが技術的に難しい理由の説明と、片方向レプリケーションをしたときの障害復旧方法としてポイントインタイムリカバリが説明されています。これは大事ですね。

同期遅延は悪いことと言われがちですが、意図しない操作ミスのために故意に遅延させるレプリケーションもあるんですね。

第6章 トランザクションと整合性・耐障害性

データベースを扱うとき、トランザクションという概念は外せないでしょう。

「やんのかやんねえのか!」ACID特製と呼ばれる特製のうちの「原子性(Atomicity)、データベースへの変更を中途半端にしないため、トランザクションという概念は一定の塊として変更を実施し、途中で何か不具合、不整合があればそれをなかったことにして全て戻すことができます。

MySQLが採用するストレージエンジンの1つであるInnoDBREDOログによって、耐障害性の確保について説明されています。REDOログとは実際のデータ書き込みとは別にコミット記録をするログです。言ってしまえば二重書き込みをしています。

MySQL
     |
バッファプール(メモリ上)
     |                                  |
データファイル(ibd)   REDOログ

バッファプールからは、書き込み頻度を減らすためにデータファイルへの書き込みは一定間隔に一度行いますが、REDOログには1つのコミットのたびに書き込まれます。万が一クラッシュした場合、データファイルとREDOログを比較し、データファイルに反映されていないコミットをシーケンス番号から特定してリカバリしてくれるわけですね。頼もしい。

二重書き込みのオーバーヘッドですが、データファイルへの書き込みはランダムライトになるのに対して、REDOログへの書き込みはシーケンシャルライトになるため、そこまで遅くならないとか。

第7章 ストレージ技術の変遷とデータベースへの影響

ハードウェアレベルでのストレージ技術の変遷について。最初はHDDでしたが、近年SSDに移り変わってきているよという話です。ストレージアクセスだけでなく「性能」という観点で、今後はボトルネックがストレージ(I/O)からネットワークやcpuに移ってくるではないかという話もあります。

第8章 データベース運用の勘どころ

データベースの運用って難しいですよね。運用する上での考え方、「よく知っている技術を使う」「実績のある技術を使う」「アーキテクチャを複雑にしない」などを紹介しつつ、監視すべき項目の説明があります。レスポンスタイム、CPU使用率、同時接続数など。

まぁこのあたりは章として基本的にこういうことはあると紹介してくれているものの、実際に運用してみるしかない感はありますね。いずれにしてもDBの監視はまず第一に考えるべきです。

第9章 MySQLに学ぶデータベース管理

この章はMySQLに特化し、導入方法、ストレージエンジンのアーキテクチャ、代表としてInnoDBの説明があるので、MySQL/MariaDBをはじめて使うひとは目を通したほうがいいでしょう。

個人的な疑問ですが、クエリキャッシュって、SELECTがまったく同じだとキャッシュから返すってことだけど、他からUPDATEされたら値変わりますよね。それごとキャッシュに載せてるってことだろうか。

また代表的なログの説明も初学者は知っておくべきです。エラーログ、スロークエリログ、一般ログ、バイナリログ。my.cnfの代表的なパラメタも紹介されていて有益です。

さらにバックアップの基礎という項目は非常に重要ですね。コールドバックアップとオンラインバックアップ、論理バックアップと物理バックアップの違い。あとバイナリログにっよるポイントインタイムリカバリは一度はやっておくと良いでしょう。

第10章 MySQLソースコードを追ってみよう

この章はさすがに流し読みで飛ばしてしまいましたが、どうしてもわからないバグに出会ってソースを読まないといけないときの入り口として重宝しそうです。

第11章 データベース技術の現在と未来

昨今のデータベース技術のトレンドを取り上げています。本書でもRDBMSと対峙する存在としてしばしばスキーマレスのNoSQLがあげられますが、現在でもそうであるように、RDBMSとNoSQLはお互いが適した場所で使われ続けていて、どちらしか使われないということはないですね。

あとはレンジパーティショニング、インデックス高速化に有利になる場面確かにありそうだなーと思いました。(時系列で並べた時とか)

第12章 ビッグデータ時代のデータベース設計

著者が勤めていたMobageでの実践知紹介の章。ソーシャルゲームならではの特徴や、大規模データベースに求められる特徴を紹介。他、データベモデルや、負荷対策。性能改善手法はいざ遅いクエリと対面した時に役にたつでしょう。

おわりに

かなり広くデータベースまわり・MySQLまわりを網羅した本だと思います。さらに実践的なテクニックや経験まで書かれていて、はじめてMySQL/MariaDB触るんだけどSELECT文しか打ったことない!ってひとにぜひおすすめです。