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

[表紙]Webエンジニアのためのデータベース技術[実践]入門 

紙版発売

A5判/336ページ

定価2,838円(本体2,580円+税10%)

ISBN 978-4-7741-5020-8

ただいま弊社在庫はございません。

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

Software Designの好評連載「データベース技術の羅針盤」の内容を中心に,加筆・修正を加えて書籍化しました。「データベースがないと何が困るのか」という読者へのアプローチから始まり,インデックス,テーブル設計,トランザクション,ハードウェアなどデータベースを扱う上で必須となる基礎知識をわかりやすく解説しています。また,後半ではMobageでの事例を基に大規模システムにおけるデータベースの設計についても言及し,この1冊でWebエンジニアが今知るべきデータベースのノウハウを理解できることができます。

こんな方におすすめ

  • データベースエンジニアを目指している方
  • Webサービスの開発に携わっている方

この書籍に関連する記事があります!

データベースがなぜ必要なのか改めて考えてみよう
Webシステムでは必ずと言ってよいほどデータベースが使われています。なぜ,Webシステムではデータベースが使われているのでしょうか。

目次

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

1-1 技術者として求められるスキルセット

  • データベース技術の重要性
  • 本書の対象読者
    • データベースの必要性がわからないという方
    • データベース技術の知識を整理したい方や,全体像をおさえたい方

1-2 データベースがないと何が困るのか

  • 大量データの中から必要なものを高速に返せない
  • 大量データはメモリ内だけでは扱えない
  • 障害が起きたときの迅速な復旧が難しい
  • 並列性の制御が難しい
  • データの整合性を保証することが難しい

1-3 本書では何を扱っていくのか

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

2-1 「キーと値のペア」を管理したい

  • 全件検索は大量データに向かない
  • 目的の位置まで一瞬でたどり付ける方法を考える
  • インデックス構造を導入する
  • ハッシュインデックス
    • ハッシュインデックスは万能ではない

2-2 インデックスのデファクト「B+Treeインデックス」

  • B+Treeインデックスとは
  • 多分木と二分木
  • B+TreeとB-Tree

2-3 RDBMSではどのように最適化を実現しているのか

  • 一意性の保証
  • マルチカラムインデックス
  • インデックスだけを読む検索
  • インデックスマージ

2-4 更新コスト削減のための取り組み

  • ディスクへのまとめ書き
  • 並列更新性能を高める

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

3-1 データモデリング技術の重要性

3-2 例題を使って考えてみよう

  • データ項目と関連性の意識
  • オーソドックスにテーブルを作ってみよう

3-3 ポイント①「テーブル関連」を導入する

  • 参照整合性制約

3-4 ポイント②テーブル設計の妥当性を検証する

  • 連番の列を導入する
  • 1:N関連を2個導入する
    • 主キーの値がよく変わる
    • レコード数が多くなる

3-5 正規化理論の基本をおさえよう

  • 第1正規形
  • 第2正規形
  • 第3正規形
  • 正規形はどこまで理解しておくべきか

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

4-1 テーブルを操作する

  • テーブルを作成する
    • データベース製品間の互換性確保は難しい
    • 一度作ったテーブルは簡単に変えられない
  • INSERT/SELECT/UPDATE/DELETEによるデータ操作
    • INSERT文
    • SELECT文
    • UPDATE文
    • DELETE文
  • ジョイン
    • 分散データベース環境とジョインの相性

4-2 SQL文の実行効率を意識する

  • 適切なインデックスが使われていることの確認
    • EXPLAIN
    • クエリ分析ツール
  • 管理系コマンド

4-3 SQLの長所と短所

  • SQLは習得が容易
    • SQLは奥が深い
  • 機能面

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

5-1 データベースはどういうときに落ちるのか

  • 典型的な障害シナリオ
    • ソフトウェア障害
    • OS障害
    • ハードウェア障害
    • 操作ミス
  • ディスク冗長化によってデータ消失を防ぐ
    • RAID
    • サーバの冗長化によってダウンタイムを減らす

5-2 レプリケーション

  • 片方向レプリケーション
    • 片方向/非同期
    • 片方向/準同期
    • 片方向/同期
  • 双方向レプリケーション
    • 双方向レプリケーションは技術的に難しい
  • 障害からの復旧方法
  • 人為的ミスへの対処
  • バックアップを戻した後どうすればよいのか
  • 故意に遅延させたレプリケーション

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

6-1 トランザクションの大切さを理解する

  • 中途半端な状態を防ぐ
  • SQL文レベルでのロールバック
  • 耐障害性を確保する
    • REDOログの役割
    • 二重書き込みのコスト

6-2 ロック機構による排他制御

  • ロックの範囲
  • ロックの期間

6-3 レプリケーションとトランザクション

  • 「アトミックなレプリケーション」の重要性
  • ユーザはアトミックなレプリケーションにどう対処しているのか

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

7-1 ハードウェアの性能改善の歴史

  • HDDによる処理の限界
  • メモリ価格の下落による64ビット環境の充実
    • メモリ上での処理の実行
    • 64ビット時代のメモリ搭載量
  • シングルスレッド処理のパフォーマンス問題
  • SATA SSDによるパフォーマンス改善
  • PCI-Express SSDの効果
    • PCI-Expressとは
    • PCI-Express SSDの効率的な使い方

7-2 データベース改善の歴史

  • CPUスケーラビリティの改善
  • ディスクI/O並列性の改善
  • バックグラウンド処理の分割/並列化

7-3 今後のデータベースに求められるもの

  • ネットワークやCPUの利用効率がより重要になる
  • 性能以外の重要性が高まる

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

8-1 データベース運用の苦労を知ろう

8-2 問題を予防する

  • よく知っている技術を使う
  • 実績のある技術を使う
    • 新しい技術のほうが不具合が多い
    • 1年後にはまた新しい技術が登場する
  • アーキテクチャを複雑にしない

8-3 問題の認知

  • 監視すべき項目
    • レスポンスタイム
    • CPU使用率
    • 同時接続数とストール
    • 秒間のSQL文実行回数
    • 接続可否およびデータベース内部の状態
    • ハードウェア障害
    • 空き領域

8-4 問題の解決

  • 性能問題への対処
    • アプリケーションの修正
    • Webサーバの増設
    • キャッシュサーバの増設
    • スレーブサーバの増設
    • よりスペックの高いサーバへの移行・サーバの分割
  • 「突然死」への対処
    • 定型的な障害
    • 非定型的な障害

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

9-1 MySQL導入のポイント

  • MySQLのインストールと基本設定
    • MySQLのダウンロード
    • ①専用ユーザの作成
    • ②データディレクトリの決定
    • ③mysqlデータベースの作成
    • ④設定ファイルmy.cnfの作成
    • ⑤MySQLの起動/接続/停止
  • ストレージエンジン
    • InnoDBストレージエンジン
    • ファイル構成

9-2 MySQL運用に必要なファイルの基礎知識

  • ログファイルの種類
    • エラーログファイル
    • スロークエリログファイル
    • 一般ログファイル
    • バイナリログファイル
  • my.cnfの設定項目
    • basedir/datadir
    • port/socket
    • default-storage-engine
    • log-bin
    • slow-query-log
    • long-query-time
    • max_connections
    • innodb_buffer_pool_size
    • innodb_flush_method
    • innodb_data_file_path
    • innodb_autoextend_increment
    • innodb_log_file_size

9-3 MySQLバックアップの基礎

  • 何のために何をバックアップするのか
  • バックアップの種類
    • コールドバックアップとオンラインバックアップ
    • 論理バックアップと物理バックアップ
  • リカバリの方法

9-4 MySQLによるバックアップ/リカバリ

  • コールドバックアップの手順
  • バイナリログによるポイントインタイムリカバリ
    • バイナリログの有効化
    • バイナリログによるリカバリ
    • バイナリログのフォーマット
    • バイナリログの配置場所
  • mysqldumpによるオンラインバックアップ
    • ロックをかけないバックアップ
    • バイナリログの削除
  • LVMスナップショット機能によるオンラインバックアップ

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

10-1 ソースコードを知ることに意味はあるのか

  • 障害が起きたときに原因を突き止めることができる
  • 自分でバグフィックスができる
  • 自分に必要な機能を実装できる
  • MySQLのソースコードを入手する

10-2 ソースコードの構造を見てみよう

  • sql
  • include
  • mysys
  • storage
  • strings
  • mysql-test
  • client

10-3 ソースコードを解析してみよう

  • 静的解析のアプローチ
  • 動的解析アプローチとMySQLのビルド方法
    • configure
    • cmake
    • makeおよびmake install
    • デバッグ起動
    • 動的解析をしてみよう

10-4 MySQLの設計思想を知ろう

  • プラグイン化を強力に推し進めている
  • 外部ライブラリには極力依存しない
  • デバッグ用の機能
  • エンディアンフリー
  • 関数ポインタ,サブクラスを多用し汎用性を上げる
  • プラグイン開発とは何か
    • MySQLのプラグイン開発の流れ
    • 本体の開発も当然ながら可能

10-5 ソースハッキングのケーススタディ

  • [ケース1]コアファイルから問題個所を特定する
    • バグの原因を突き止める
    • MySQLのクラッシュバグ
    • パッチの作成
  • [ケース2]スタックトレースから問題個所を特定する
    • 原因究明の考え方
    • スタックトレースを取るシェルスクリプト
    • スタックトレースの分析
    • 問題個所のソースコード
    • 待たされているsql_parse.ccのソースコード
  • [ケース3]新機能を追加してみる
    • ソースコード上の変更個所を特定する
    • どの条件を満たしたらヒープソートを行うのかを決める
    • ヒープソート処理を実装する
    • EXPLAINの結果出力を制御する
    • テストケースを作成する
  • パッチの実行例

10-6 MySQLの開発コミュニティ

  • バグレポート
  • WorkLogで新機能を登録
  • パッチの投稿/レビュー/議論
    • パッチのレビュー

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

11-1 データベース技術のトレンド

  • データモデリングとSQL
  • オンラインでの定義変更
    • トリガーを使って変更履歴を記録し,あとでまとめて反映
    • レプリケーション構成を活用
  • スキーマレスのデータベース

11-2 大量データを高速に扱う技術

  • インデックス性能の劣化要因
  • レンジパーティショニング
  • B+Tree以外のインデックス
  • 高速なSSDの利用
  • トランザクション
    • 整合性のあるレプリケーションを実現
    • 一貫性のあるバックアップを保証

11-3 分析系処理と列指向データベース

  • 分析系の処理は何が難しいのか
    • DWH型のテーブル設計やSQL文を知ろう
    • DWH型のテーブル
    • DWH型のSQL文
    • レコード数およびデータサイズが大きい
  • 従来型RDBMSにおける課題
    • 処理対象ではない列にもアクセスが行われる
    • インデックス設計がきわめて難しい
    • 範囲検索で大量のレコードにマッチする
  • 列指向データベースとは何か
  • 列指向データベースのメリット
    • 必要な列だけがアクセスされるのでI/O効率が高い
    • 圧縮効率が良い
    • ロード処理が高速
  • 列指向データベースのデメリット
    • 主キー検索などの狭い範囲の処理が遅い
    • 製品としての成熟度が低い

11-4 NoSQLデータベース

  • インメモリの処理が生み出した新たな課題
  • SQLデータベースの課題
  • NoSQLとは何か
  • テーブル/ファイルを開きっぱなしにする
  • 一般的なNoSQLの欠点
    • トランザクションをサポートしていない
    • 「スキーマ」がない
    • 主キー以外のインデックスを使えない
  • NoSQLの用途
    • キャッシュ
    • セッションデータ
  • RDBMSとNoSQLのハイブリッド構成
    • MySQL Cluster(NDB)
    • myCached/HandlerSocket
  • 分散データベース

11-5 その他のトピック

  • Write Onceのデータベース
  • Write Scaling
    • マルチマスタ構成
    • 自動Shard編成

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

12-1 Webサービスのためのデータベース概論

  • データベースの選定基準
  • ソーシャルゲームの主な特徴
    • ユーザ数が基本的に多く一気に増えることもある
    • 主な情報はすべてサーバ側で持つ
    • ユーザIDをキーにした処理が多い
    • 構造化されたデータ項目が多い
    • 永続的に必要とされるデータと期間限定のデータがある
    • 可用性や整合性に関する要求が意外と高い
  • 大規模Webサービス向けのデータベースに求められる機能
    • オンライン(無停止)でのスキーマ変更
    • 水平分散(Sharding)の容易さ
    • 安定性
    • 単一障害点の除去
    • 2ヵ所以上のデータセンター
    • 単体性能の高さ
    • 局所的な超高速化
  • 規模が違えば選定基準も変わる

12-2 Mobageにおけるデータベースの活用事例

  • 大規模サービスとデータベース
  • クラウドとリアルサーバ
    • トラフィック増加/減少への対応
    • 性能改善
    • 性能分析
    • 運用体制の整備
    • DeNAおよび子会社での経験
  • データベースの製品選定
    • 性能が高いこと
    • 時系列/履歴系データの扱いに長けていること
    • トランザクション/耐障害機能が充実していること
    • 良質のドキュメント/品質/普及度を満たしている

12-3 Webサービスとデータモデリング

  • データモデリングの重要性を知ろう
  • データの分類
    • マスタ系のテーブル
    • トランザクション系のテーブル
  • テーブル関連
    • 1対多関係
    • 派生関係
    • 階層関係
    • 「階層型部品表」タイプ

12-4 データ量増加対策と高速化手法

  • テーブルサイズと負荷対策
    • INSERT主体のテーブル
    • INSERTの性能指標
    • 時系列処理の高速化アプローチ
  • DELETEのチューニング
    • データの保持期間を確認する
    • データ削除のやり方によっても成果は変わる
    • スレーブ遅延を防ぐには
  • UPDATE主体のテーブル
  • 負荷傾向をモニタリングする

12-5 MySQLにおける性能改善テクニック

  • クエリを改善する
    • 遅いクエリを洗い出す
    • ソートの実行効率に注意する
    • 実行頻度の多いクエリを洗い出す
  • 遅いトランザクションを改善する
    • MySlowTranCaptureによる遅いトランザクションの洗い出し
  • ロック競合への配慮
    • タイムアウト設定
    • ロックを長時間かけない
    • 異なるサーバ間でのデッドロックに注意する

著者プロフィール

松信嘉範(まつのぶよしのり)

MySQLを中心としたデータベース技術のエキスパート。

MySQLコンサルタントとして多くの現場の問題を解決したり,サービス事業者のスタッフとして腰を据えた運用をしたりと,現場主義のポリシーを貫いている。

主な著書に『Linux-DBシステム構築/運用入門』『現場で使えるMySQL』(いずれも翔泳社刊)などがある。