Software Design plusシリーズWebエンジニアのためのデータベース技術[実践]入門
2012年3月9日紙版発売
松信嘉範 著
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による遅いトランザクションの洗い出し
- ロック競合への配慮
- タイムアウト設定
- ロックを長時間かけない
- 異なるサーバ間でのデッドロックに注意する
この本に関連する書籍
-
理論から学ぶデータベース実践入門 ―― リレーショナルモデルによる効率的なSQL
本書は,DBを使ったアプリケーション開発経験があるエンジニアを対象に,リレーショナルモデルを理解し,より効率的にDB設計を行い,適切にSQLを使いこなすために必要な...
-
データベース徹底攻略
WEB+DB PRESS plus 徹底攻略シリーズでは,Webアプリケーション開発のためのプログラミング技術情報誌『WEB+DB PRESS』の掲載記事をテーマ別に厳選し,再編集してお届け...
-
平成26年度データベーススペシャリスト合格教本
情報処理技術者試験の「データベーススペシャリスト試験」を受験される方を対象とした参考書。綿密な解説により,試験対策だけではなくデータベースに関する知識や理解...
-
平成26年度データベーススペシャリスト パーフェクトラーニング過去問題集
情報処理技術者試験の「データベーススペシャリスト」試験の過去問題集です。紙面4回・PDF1回で現制度の全試験を年度別に掲載,午前問題は見開き構成で,素早く「解く」...
-
データベースエンジニア養成読本[DBを自由自在に活用するための知識とノウハウ満載!]
NoSQLの普及,Hadoopなどによるビッグデータの蓄積と活用といった技術トレンドの中で,データベースを開発・運用で活用するためのスキルや考え方が少しずつ変わってきて...
-
プロになるための データベース技術入門―MySQL for Windows 困ったときに役立つ開発・運用ガイド
本書は,MySQLのWindows版を対象にその特徴や使い方を解説します。障害発生時にどうしたらよいのか,データベース技術の基礎の基礎から,応用までじっくりデータベース...
-
[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ
サーバを単に増やすだけでは解決しない(?!)。大規模サービスの難所は,サービスの成長に伴い巨大化するデータの処理です。データ量の変化は緩やかには推移せず,突然...
-
エキスパートのための MySQL[運用+管理]トラブルシューティングガイド
高額なデータベースシステムでなくとも十分との認識が広まったことから,MySQLがクローズアップされて久しい。すでに書籍も少なからず出版されていますが,多くの場合は...