実践ハイパフォーマンスMySQL 第2版

[cover photo]
  • 2009年12月 発行
  • 736ページ
  • ISBN978-4-87311-426-2
  • フォーマット PDF
  • 原書: High Performance MySQL, Second Edition


本書は、MySQLアプリケーション開発者ならびにMySQL管理者が求める必須の知識や手法を掘り下げて、MySQLのパフォーマンスを最大限に引き出すためのさまざまな深い問題を解説する専門書である。第2版では、初版で取り上げたすべてのテーマをさらに掘り下げながら、新しいテーマを盛り込んで、大幅な改訂がなされている。「サーバーでいろいろ試してみてようやく現実のアプリケーションを書いてみる気になったMySQLの新規ユーザーと、MySQLベースのよく調整されたアプリケーションがすでにあるが、それらのパフォーマンスを“もう少し”改善する必要がある経験豊富なユーザーに本書をお勧めする。」(Michael Wideniusによる「本書に寄せて」より)読者のMySQLのスキルを一段高いレベルに引き上げるのに役立つ労作である。

関連書籍

実践ハイパフォーマンスMySQL 第3版
初めてのPHP & MySQL 第2版

はじめに

1章 MySQLのアーキテクチャ
    1.1 MySQLの論理アーキテクチャ
        1.1.1 接続の管理とセキュリティ
        1.1.2 最適化と実行
    1.2 並行性の制御
        1.2.1 読み取り/書き込みロック
        1.2.2 ロックの粒度
    1.3 トランザクション
        1.3.1 分離レベル
        1.3.2 デッドロック
        1.3.3 トランザクションログ
        1.3.4 MySQLのトランザクション
    1.4 マルチバージョンの並行性制御(MVCC)
    1.5 MySQLのストレージエンジン
        1.5.1 MyISAMエンジン
        1.5.2 MyISAM Mergeエンジン
        1.5.3 InnoDBエンジン
        1.5.4 メモリエンジン
        1.5.5 Archiveエンジン
        1.5.6 CSVエンジン
        1.5.7 Federatedエンジン
        1.5.8 Blackholeエンジン
        1.5.9 NDB Clusterエンジン
        1.5.10 Falconエンジン
        1.5.11 solidDBエンジン
        1.5.12 PBXT(Primebase XT)エンジン
        1.5.13 Mariaエンジン
        1.5.14 その他のストレージエンジン
        1.5.15 正しいエンジンの選択
        1.5.16 注意事項
        1.5.17 実例
        1.5.18 ストレージエンジンのまとめ
        1.5.19 テーブル変換

2章 ボトルネックの検出:ベンチマークとプロファイリング
    2.1 ベンチマークを実行する理由
    2.2 ベンチマーク戦略
        2.2.1 何を測定するか
    2.3 ベンチマーク戦術
        2.3.1 ベンチマークの設計と計画
        2.3.2 正確な結果の取得
        2.3.3 ベンチマークの実行と結果の分析
    2.4 ベンチマークツール
        2.4.1 フルスタックツール
        2.4.2 単一コンポーネントツール
    2.5 ベンチマークの例
        2.5.1 http_load
        2.5.2 sysbench
        2.5.3 Database Test Suiteのdbt2 TPC-C
        2.5.4 MySQL Benchmark Suite
    2.6 プロファイリング
        2.6.1 アプリケーションのプロファイリング
        2.6.2 MySQLのプロファイリング
        2.6.3 MySQLサーバーのプロファイリング
        2.6.4 SHOW STATUSによるクエリのプロファイリング
        2.6.5 SHOW PROFILE
        2.6.6 MySQLの他のプロファイリング方法
        2.6.7 プロファイリングコードを追加できない場合
    2.7 オペレーティングシステムのプロファイリング
        2.7.1 MySQL接続とプロセスのトラブルシューティング
        2.7.2 高度なプロファイリングとトラブルシューティング

3章 スキーマの最適化とインデックス
    3.1 最適なデータ型の選択
        3.1.1 整数
        3.1.2 実数
        3.1.3 文字列型
        3.1.4 日付と時刻型
        3.1.5 ビットデータ型
        3.1.6 識別子の選択
        3.1.7 特殊なデータ型
    3.2 インデックスの基礎
        3.2.1 インデックスの種類
    3.3 高いパフォーマンスを実現するためのインデックス戦略
        3.3.1 列の分離
        3.3.2 プレフィックスインデックスとインデックスの選択性
        3.3.3 クラスタ化インデックス
        3.3.4 カバリングインデックス
        3.3.5 ソートのためのインデックススキャンの使用
        3.3.6 圧縮された(プレフィックス圧縮された)インデックス
        3.3.7 冗長インデックスと重複インデックス
        3.3.8 インデックスとロック
    3.4 インデックスのケーススタディ
        3.4.1 さまざまなフィルタのサポート
        3.4.2 複数の範囲条件の回避
        3.4.3 ソートの最適化
    3.5 インデックスとテーブルの管理
        3.5.1 テーブルの破損の検出と修復
        3.5.2 インデックス統計の更新
        3.5.3 インデックスとデータの断片化の削減
    3.6 正規化と非正規化
        3.6.1 正規化されたスキーマの長所と短所
        3.6.2 非正規化されたスキーマの長所と短所
        3.6.3 正規化と非正規化の混合
        3.6.4 キャッシュテーブルとサマリテーブル
    3.7 ALTER TABLEの高速化
        3.7.1 .frmファイルのみの変更
        3.7.2 MyISAMインデックスのすばやい構築
    3.8 ストレージエンジンに関する注意点
        3.8.1 MyISAMストレージエンジン
        3.8.2 Memoryストレージエンジン
        3.8.3 InnoDBストレージエンジン

4章 クエリパフォーマンスの最適化
    4.1 スロークエリの基礎:データアクセスの最適化
        4.1.1 データベースから必要のないデータを取得していないか
        4.1.2 MySQLが調査するデータが多すぎないか
    4.2 クエリを再構築する方法
        4.2.1 複雑なクエリと多数のクエリ
        4.2.2 クエリの分割
        4.2.3 結合分解
    4.3 クエリの実行の基礎
        4.3.1 MySQLクライアント/サーバープロトコル
        4.3.2 クエリキャッシュ
        4.3.3 クエリ最適化プロセス
        4.3.4 クエリ実行エンジン
        4.3.5 クライアントへの結果の返送
    4.4 MySQLクエリオプティマイザの制限
        4.4.1 相関サブクエリ
    4.5 特定の種類のクエリの最適化
        4.5.1 COUNTクエリの最適化
        4.5.2 JOINクエリの最適化
        4.5.3 サブクエリの最適化
        4.5.4 GROUP BYとDISTINCTの最適化
        4.5.5 LIMITとOFFSETの最適化
        4.5.6 SQL_CALC_FOUND_ROWSの最適化
        4.5.7 UNIONの最適化
    4.6 クエリオプティマイザのヒント
    4.7 ユーザー定義変数
        4.7.1 MySQLのアップグレードに関する注意点

5章 MySQLの高度な機能
    5.1 MySQLクエリキャッシュ
        5.1.1 MySQLがキャッシュヒットをチェックする方法
        5.1.2 キャッシュはどのようにメモリを使用するか
        5.1.3 クエリキャッシュが役立つ状況
        5.1.4 クエリキャッシュの調整と管理の方法
        5.1.5 InnoDBとクエリキャッシュ
        5.1.6 一般的なクエリキャッシュの最適化
        5.1.7 クエリキャッシュに代わるもの
    5.2 MySQL内でのコードの格納
        5.2.1 ストアドプロシージャとストアド関数
        5.2.2 トリガ
        5.2.3 イベント
        5.2.4 ストアドコードでのコメントの維持
    5.3 カーソル
    5.4 プリペアドステートメント
        5.4.1 プリペアドステートメントの最適化
        5.4.2 プリペアドステートメントへのSQLインターフェイス
        5.4.3 プリペアドステートメントの制限
    5.5 ユーザー定義関数
    5.6 ビュー
        5.6.1 更新可能ビュー
        5.6.2 ビューによるパフォーマンスへの影響
        5.6.3 ビューの制限
    5.7 文字セットと照合順序
        5.7.1 MySQLは文字セットをどう扱うか
        5.7.2 文字セットと照合順序の選択
        5.7.3 文字セットと照合順序がクエリに与える影響
    5.8 全文検索
        5.8.1 自然言語の全文検索
        5.8.2 ブーリアン全文検索
        5.8.3 MySQL 5.1以降での全文検索の変更点
        5.8.4 全文検索のトレードオフと次善策
        5.8.5 全文インデックスの調整と最適化
    5.9 外部キー制約
    5.10 マージテーブルとパーティショニング
        5.10.1 マージテーブル
        5.10.2 パーティションテーブル
    5.11 分散(XA)トランザクション
        5.11.1 内部XAトランザクション
        5.11.2 外部XAトランザクション

6章 サーバー設定の最適化
    6.1 設定の基礎
        6.1.1 構文、スコープ、動的な変数
        6.1.2 変数設定の副作用
        6.1.3 変数を設定するための準備
    6.2 一般的な調整
        6.2.1 メモリの調整
        6.2.2 MyISAMキーキャッシュ
        6.2.3 InnoDBバッファプール
        6.2.4 スレッドキャッシュ
        6.2.5 テーブルキャッシュ
        6.2.6 InnoDBデータディクショナリ
    6.3 MySQLのI/Oの調整
        6.3.1 MyISAMのI/Oの調整
        6.3.2 InnoDBのI/Oの調整
    6.4 MySQLの並行処理の調整
        6.4.1 MyISAMの並行処理の調整
        6.4.2 InnoDBの並行処理の調整
    6.5 ワークロードベースの調整
        6.5.1 BLOBワークロードとTEXTワークロードのための最適化
        6.5.2 MySQLサーバーの状態変数の調査
    6.6 接続ごとの設定の調整

7章 オペレーティングシステムとハードウェアの最適化
    7.1 MySQLのパフォーマンスを制限するもの
    7.2 MySQLに合わせてCPUを選択する方法
        7.2.1 CPUの速さか、CPUの数か
        7.2.2 CPUアーキテクチャ
        7.2.3 複数のCPUとコアへの拡張
    7.3 メモリリソースとディスクリソースのバランス
        7.3.1 ランダムI/OとシーケンシャルI/O
        7.3.2 キャッシュ、読み取り、書き込み
        7.3.3 作業セットは何か
        7.3.4 メモリとディスクの効果的な割合の検出
        7.3.5 ハードディスクの選択
    7.4 スレーブのためのハードウェアの選択
    7.5 RAIDのパフォーマンスの最適化
        7.5.1 RAIDの障害、復元、監視
        7.5.2 ハードウェアRAIDとソフトウェアRAIDのバランス
        7.5.3 RAID設定とRAIDキャッシュ
    7.6 SANとNAS
        7.6.1 SAN
        7.6.2 NAS
    7.7 複数のディスクボリュームの使用
    7.8 ネットワーク設定
    7.9 オペレーティングシステムの選択
    7.10 ファイルシステムの選択
    7.11 スレッディング
    7.12 スワッピング
    7.13 オペレーティングシステムの状態
        7.13.1 vmstatの出力の読み方
        7.13.2 iostatの出力の読み方
        7.13.3 CPUバウンドのマシン
        7.13.4 I/Oバウンドのマシン
        7.13.5 スワッピングマシン
        7.13.6 アイドルマシン

8章 レプリケーション
    8.1 レプリケーションの概要
        8.1.1 レプリケーションによって解決される問題
        8.1.2 レプリケーションの仕組み
    8.2 レプリケーションの設定
        8.2.1 レプリケーションアカウントの作成
        8.2.2 マスターとスレーブの設定
        8.2.3 スレーブの開始
        8.2.4 別のサーバーからのスレーブの初期化
        8.2.5 推奨されるレプリケーション設定
    8.3 レプリケーションの裏側
        8.3.1 ステートメントベースのレプリケーション
        8.3.2 行ベースのレプリケーション
        8.3.3 レプリケーションファイル
        8.3.4 他のスレーブへのレプリケーションイベントの送信
        8.3.5 レプリケーションフィルタ
    8.4 レプリケーショントポロジ
        8.4.1 マスターと複数のスレーブ
        8.4.2 アクティブ/アクティブモードでのマスター/
   マスターレプリケーション
        8.4.3 アクティブ/パッシブモードでのマスター/
   マスターレプリケーション
        8.4.4 複数のスレーブを持つマスター/マスターレプリケーション
        8.4.5 リングレプリケーション
        8.4.6 マスター、分散マスター、スレーブ
        8.4.7 ツリーまたはピラミッド
        8.4.8 カスタムレプリケーションソリューション
    8.5 レプリケーションとキャパシティの計画
        8.5.1 レプリケーションが書き込みのスケーラビリティに役立たない理由
        8.5.2 利用率を抑える計画
    8.6 レプリケーションの管理とメンテナンス
        8.6.1 レプリケーションの監視
        8.6.2 スレーブの遅延の測定
        8.6.3 スレーブとマスターの一貫性の確認
        8.6.4 マスターからのスレーブの再同期
        8.6.5 マスターの変更
        8.6.6 マスター/マスター構成での役割の切り替え
    8.7 レプリケーションの問題点と解決策
        8.7.1 データの破壊または損失によるエラー
        8.7.2 非トランザクショナルテーブルの使用
        8.7.3 トランザクショナルテーブルと非トランザクショナルテーブルの混在
        8.7.4 非決定的な文
        8.7.5 マスターとスレーブでストレージエンジンが異なる
        8.7.6 スレーブでのデータの変更
        8.7.7 一意でないサーバーID
        8.7.8 未定義のサーバーID
        8.7.9 複製されていないデータへの依存
        8.7.10 一時テーブルの損失
        8.7.11 複製する更新の選択
        8.7.12 InnoDBのロック選択によるロックの競合
        8.7.13 マスター/マスターレプリケーションでの
     両方のマスターへの書き込み
        8.7.14 レプリケーションの過度の遅延
        8.7.15 マスターからの特大パケット
        8.7.16 レプリケーションの帯域幅の制限
        8.7.17 ディスク領域の不足
        8.7.18 レプリケーションの制限
    8.8 レプリケーションの速度
    8.9 MySQLレプリケーションの未来

9章 スケーラビリティと高可用性
    9.1 用語
    9.2 MySQLのスケーリング
        9.2.1 スケーラビリティの計画
        9.2.2 スケーリング前の時間稼ぎ
        9.2.3 スケールアップ
        9.2.4 スケールアウト
        9.2.5 スケールバック
        9.2.6 クラスタ化によるスケーリング
    9.3 負荷分散
        9.3.1 直接接続
        9.3.2 プロキシの導入
        9.3.3 1つのマスターと複数のスレーブによる負荷分散
    9.4 高可用性
        9.4.1 高可用性の計画
        9.4.2 冗長性の追加
        9.4.2 フェイルオーバーとフェイルバック

10章 アプリケーションレベルの最適化
    10.1 アプリケーションのパフォーマンスの概要
        10.1.1 問題の原因の究明
        10.1.2 一般的な問題の調査
    10.2 Webサーバーの問題
        10.2.1 最適な並行性の模索
    10.3 キャッシュ
        10.3.1 アプリケーションよりも低いレベルでのキャッシュ
        10.3.2 アプリケーションレベルのキャッシュ
        10.3.3 キャッシュ制御ポリシー
        10.3.4 キャッシュオブジェクト階層
        10.3.5 コンテンツの事前生成
    10.4 MySQLの拡張
    10.5 MySQLに代わるもの

11章 バックアップとリカバリ
    11.1 概要
        11.1.1 用語
        11.1.2 リカバリがすべて
        11.1.3 ここで取り上げない話題
        11.1.4 全体像
        11.1.5 バックアップする理由
    11.2 注意点と妥協点
        11.2.1 失ってもよいものは何か
        11.2.2 オンラインバックアップとオフラインバックアップ
        11.2.3 論理バックアップとローバックアップ
        11.2.4 何をバックアップするか
        11.2.5 ストレージエンジンと一貫性
        11.2.6 レプリケーション
    11.3 バイナリログの管理とバックアップ
        11.3.1 バイナリログのフォーマット
        11.3.2 古いバイナリログの安全なパージ
    11.4 データのバックアップ
        11.4.1 論理バックアップの作成
        11.4.2 ファイルシステムのスナップショット
    11.5 バックアップからのリカバリ
        11.5.1 MySQLへのアクセスの制限
        11.5.2 ローファイルの復元
        11.5.3 論理バックアップの復元
        11.5.4 Point-in-Timeリカバリ
        11.5.5 より高度なリカバリ手法
        11.5.6 InnoDBのリカバリ
    11.6 バックアップとリカバリの速さ
    11.7 バックアップツール
        11.7.1 mysqldump
        11.7.2 mysqlhotcopy
        11.7.3 InnoDB Hot Backup
        11.7.4 mk-parallel-dump
        11.7.5 mylvmbackup
        11.7.6 Zmanda Recovery Manager
        11.7.7 R1Soft
        11.7.8 MySQLオンラインバックアップ
        11.7.9 バックアップツールの比較
    11.8 バックアップのスクリプト化

12章 セキュリティ
    12.1 用語
    12.2 アカウントの基礎
        12.2.1 特権
        12.2.2 グラントテーブル
        12.2.3 MySQLが特権を確認する方法
        12.2.4 グラントの追加、削除、表示
        12.2.5 MySQL特権のセットアップ
        12.2.6 MySQL 4.1での特権の変更
        12.2.7 MySQL 5.0での特権の変更
        12.2.8 特権とパフォーマンス
        12.2.9 一般的な問題と解決策
    12.3 オペレーティングシステムのセキュリティ
        12.3.1 ガイドライン
    12.4 ネットワークのセキュリティ
        12.4.1 localhostのみの接続
        12.4.2 ファイアウォール
        12.4.3 DMZでのMySQL
        12.4.4 接続の暗号化とトンネリング
        12.4.5 TCPラッパー
        12.4.6 ホストの自動ブロック
    12.5 データの暗号化
        12.5.1 パスワードのハッシュ
        12.5.2 暗号化ファイルシステム
        12.5.3 アプリケーションレベルの暗号化
        12.5.4 ソースコードの変更
    12.6 chroot環境でのMySQL

13章 MySQLサーバーの状態
    13.1 システム変数
    13.2 SHOW STATUS
        13.2.1 スレッドと接続の統計値
        13.2.2 バイナリログの状態
        13.2.3 コマンドカウンタ
        13.2.4 一時ファイルと一時テーブル
        13.2.5 ハンドラ操作
        13.2.6 MyISAMキーバッファ
        13.2.7 ファイル記述子
        13.2.8 クエリキャッシュ
        13.2.9 SELECTの種類
        13.2.10 ソート
        13.2.11 テーブルロック
        13.2.12 SSL
        13.2.13 InnoDB固有の変数
        13.2.14 プラグイン固有の変数
        13.2.15 その他の変数
    13.3 SHOW INNODB STATUS
        13.3.1 見出し
        13.3.2 SEMAPHORES
        13.3.3 LATEST FOREIGN KEY ERROR
        13.3.4 LATEST DETECTED DEADLOCK
        13.3.5 TRANSACTIONS
        13.3.6 FILE I/O
        13.3.7 INSERT BUFFER AND ADAPTIVE HASH INDEX
        13.3.8 LOG
        13.3.9 BUFFER POOL AND MEMORY
        13.3.10 ROW OPERATIONS
    13.4 SHOW PROCESSLIST
    13.5 SHOW MUTEX STATUS
    13.6 レプリケーションの状態
    13.7 INFORMATION_SCHEMA

14章 ハイパフォーマンスのためのツール
    14.1 インターフェイスツール
        14.1.1 MySQLのビジュアルツール
        14.1.2 SQLyog
        14.1.3 phpMyAdmin
    14.2 監視ツール
        14.2.1 非対話型の監視システム
        14.2.2 対話型ツール
    14.3 解析ツール
        14.3.1 HackMySQLツール
        14.3.2 Maatkitの解析ツール
    14.4 MySQLユーティリティ
        14.4.1 MySQL Proxy
        14.4.2 DormandoのProxy for MySQL
        14.4.3 Maatkitユーティリティ
    14.5 その他の情報源

付録A 大きなファイルの転送
    A.1 ファイルのコピー
        A.1.1 安直な方法
        A.1.2 ワンステップの方法
        A.1.3 暗号化のオーバーヘッドの回避
        A.1.4 その他のオプション
    A.2 ファイルのコピーのベンチマーク

付録B EXPLAINの使用
    B.1 EXPLAINの実行
        B.1.1 非SELECTクエリの書き換え
    B.2 EXPLAINの列
        B.2.1 id列
        B.2.2 select_type列
        B.2.3 table列
        B.2.4 type列
        B.2.5 possible_keys列
        B.2.6 key列
        B.2.7 key_len列
        B.2.8 ref列
        B.2.9 rows列
        B.2.10 filtered列
        B.2.11 Extra列
    B.3 ビジュアルなEXPLAIN

付録C MySQLでのSphinxの使用
    C.1 概要:一般的なSphinx検索
    C.2 Sphinxを使用する理由
        C.2.1 効率的でスケーラブルな全文検索
        C.2.2 WHERE句の効率的な適用
        C.2.3 結果を上位のものから順に検索する
        C.2.4 GROUP BYクエリの最適化
        C.2.5 結果セットの並行生成
        C.2.6 スケーリング
        C.2.7 シャードデータの集計
    C.3 アーキテクチャの概要
        C.3.1 インストールの概要
        C.3.2 パーティションの一般的な用途
    C.4 特別な機能
        C.4.1 フレーズ近傍ランキング
        C.4.2 属性のサポート
        C.4.3 フィルタリング
        C.4.4 SphinxSEストレージエンジン
        C.4.5 高度なパフォーマンス制御
    C.5 実装の実例
        C.5.1 Mininova.orgの全文検索
        C.5.2 BoardReader.comでの全文検索
        C.5.3 Sahibinden.comでの選択の最適化
        C.5.4 BoardReader.comでのGROUP BYの最適化
        C.5.5 Grouply.comでのシャードJOINクエリの最適化
    C.6 まとめ

付録D ロックのデバッグ
    D.1 サーバーレベルでのロック待ち
        D.1.1 テーブルロック
        D.1.2 グローバル読み取りロック
        D.1.3 名前ロック
        D.1.4 ユーザーロック
    D.2 ストレージエンジンでのロック待ち
        D.2.1 InnoDBのロック待ち
        D.2.2 Falconのロック待ち

索引

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]