新しい情報を盛り込み、信頼性や正確さといった目標を重視するという前版からの方針に加えて、第3版では、MySQLの動作の仕組みに関する事実だけでなく、MySQLがそのように動作する原理を伝えたいと考えて執筆されている。そうした原理の実質的な効果を示す、より具体的なストーリーやケーススタディを盛り込んで、それらをベースとして、「MySQLの内部のアーキテクチャや処理がそうなっているとしたら、実際の使用状況で実質的にどのような効果が得られるのか」、「そうした効果はなぜ重要なのか」、「結果として、MySQLは特定のニーズにどのように適しているか、あるいは適していないか」という質問に答えている。MySQL管理者やアプリケーション開発者が求める必須の知識や手法を掘り下げて、問題や課題に対して実践的な考え方と解決の手法を示す。読者のMySQLについての理解と技術を一段高いレベルに引き上げる。改訂第3版。
実践ハイパフォーマンスMySQL 第3版
Baron Schwartz、Peter Zaitsev、Vadim Tkachenko 著、菊池 研自 監訳、株式会社クイープ 訳
- TOPICS
- Database
- 発行年月日
- 2013年11月
- PRINT LENGTH
- 864
- ISBN
- 978-4-87311-638-9
- 原書
- High Performance MySQL, 3rd Edition
- FORMAT
目次
まえがき はじめに 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 InnoDBエンジン 1.5.2 MyISAMエンジン 1.5.3 MySQLのその他の組み込みエンジン 1.5.4 サードパーティのストレージエンジン 1.5.5 正しいストレージエンジンの選択 1.5.6 テーブルの変換 1.6 MySQLの歴史 1.7 MySQLの開発モデル 1.8 まとめ 2章 MySQLのベンチマーク 2.1 ベンチマークを実行する理由 2.2 ベンチマークの戦略 2.2.1 何を計測するか 2.3 ベンチマークの戦術 2.3.1 ベンチマークの設計と計画 2.3.2 ベンチマークを実行する時間の長さ 2.3.3 システムのパフォーマンスとステータスを捕捉する 2.3.4 正確な結果を取得する 2.3.5 ベンチマークを実行し、結果を分析する 2.3.6 グラフ化の重要性 2.4 ベンチマークツール 2.4.1 フルスタックツール 2.4.2 単一コンポーネントツール 2.5 ベンチマークの例 2.5.1 http_load 2.5.2 MySQL Benchmark Suite 2.5.3 SysBench 2.5.4 Database Test Suiteの dbt2 TPC-C 2.5.5 Perconaの TPCC-MySQLツール 2.6 まとめ 3章 サーバーのパフォーマンスのプロファイリング 3.1 速習:パフォーマンスの最適化 3.1.1 プロファイリングによる最適化 3.1.2 プロファイルを解釈する 3.2 アプリケーションのプロファイリング 3.2.1 PHPアプリケーションのプロファイリング 3.3 MySQLクエリのプロファイリング 3.3.1 サーバーのワークロードのプロファイリング 3.3.2 単一のクエリのプロファイリング 3.3.3 最適化にプロファイルを使用する 3.4 断続的な問題の診断 3.4.1 単一のクエリの問題とサーバーレベルの問題 3.4.2 診断データを収集する 3.4.3 診断のケーススタディ 3.5 その他のプロファイリングツール 3.5.1 USER_STATISTICSテーブルを使用する 3.5.2 straceを使用する 3.6 まとめ 4章 スキーマとデータ型の最適化 4.1 最適なデータ型の選択 4.1.1 整数 4.1.2 実数 4.1.3 文字列型 4.1.4 日付と時刻型 4.1.5 ビットデータ型 4.1.6 ID列の選択肢 4.1.7 特殊なデータ型 4.2 MySQLでのスキーマの設計 4.3 正規化と非正規化 4.3.1 正規化されたスキーマの長所と短所 4.3.2 非正規化されたスキーマの長所と短所 4.3.3 正規化と非正規化の混合 4.4 キャッシュテーブルとサマリテーブル 4.4.1 マテリアライズドビュー 4.4.2 カウンタテーブル 4.5 ALTER TABLEの高速化 4.5.1 .frmファイルのみを変更する 4.5.2 MyISAMインデックスをすばやく構築する 4.6 まとめ 5章 インデックスによるパフォーマンスの向上 5.1 インデックスの基礎 5.1.1 インデックスの種類 5.2 インデックスの利点 5.3 ハイパフォーマンスを可能にするインデックス戦略 5.3.1 列の分離 5.3.2 プレフィックスインデックスとインデックスの選択性 5.3.3 複数列のインデックス 5.3.4 適切な列の順序を選択する 5.3.5 クラスタ化インデックス 5.3.6 カバリングインデックス 5.3.7 ソートにインデックススキャンを使用する 5.3.8 圧縮された(プレフィックス圧縮された)インデックス 5.3.9 冗長インデックスと重複インデックス 5.3.10 使用されないインデックス 5.3.11 インデックスとロック 5.4 インデックスのケーススタディ 5.4.1 さまざまなフィルタのサポート 5.4.2 複数の範囲条件の回避 5.4.3 ソートの最適化 5.5 インデックスとテーブルの管理 5.5.1 テーブルの破損の検出と修復 5.5.2 インデックス統計を更新する 5.5.3 インデックスとデータの断片化を削減する 5.6 まとめ 6章 クエリのパフォーマンスの最適化 6.1 クエリが低速な理由 6.2 スロークエリの基礎:データアクセスの最適化 6.2.1 データベースから必要のないデータを取得していないか 6.2.2 MySQL が調査するデータが多すぎないか 6.3 クエリを再構築する方法 6.3.1 複雑なクエリと大量のクエリ 6.3.2 クエリを分割する 6.3.3 結合分解 6.4 クエリの実行の基礎 6.4.1 MySQL クライアント/ サーバープロトコル 6.4.2 クエリキャッシュ 6.4.3 クエリ最適化プロセス 6.4.4 クエリ実行エンジン 6.4.5 クライアントへの結果の返送 6.5 クエリオプティマイザの制限 6.5.1 相関サブクエリ 6.5.2 UNION の制限 6.5.3 インデックスマージの最適化 6.5.4 等式の伝播 6.5.5 並行実行 6.5.6 ハッシュ結合 6.5.7 ルーズインデックススキャン 6.5.8 MIN とMAX 6.5.9 同じテーブルでのSELECT とUPDATE 6.6 クエリオプティマイザのヒント 6.7 クエリの種類に応じた最適化 6.7.1 COUNT クエリの最適化 6.7.2 JOINクエリの最適化 6.7.3 サブクエリの最適化 6.7.4 GROUP BYと DISTINCTの最適化 6.7.5 LIMITと OFFSETの最適化 6.7.6 SQL_CALC_FOUND_ROWSの最適化 6.7.7 UNIONの最適化 6.7.8 静的なクエリ解析 6.7.9 ユーザー定義変数 6.8 ケーススタディ 6.8.1 MySQLでキューテーブルを作成する 6.8.2 2つの地点を結ぶ距離を計算する 6.8.3 ユーザー定義関数を使用する 6.9 まとめ 7章 MySQLの高度な機能 7.1 パーティションテーブル 7.1.1 パーティショニングの仕組み 7.1.2 パーティショニングの種類 7.1.3 パーティショニングの使用法 7.1.4 注意すべき問題 7.1.5 クエリの最適化 7.1.6 マージテーブル 7.2 ビュー 7.2.1 更新可能なビュー 7.2.2 ビューによるパフォーマンスへの影響 7.2.3 ビューの制限 7.3 外部キー制約 7.4 MySQL内でのコードの格納 7.4.1 ストアドプロシージャとストアドファンクション 7.4.2 トリガ 7.4.3 イベント 7.4.4 ストアドコードでのコメントの維持 7.5 カーソル 7.6 プリペアドステートメント 7.6.1 プリペアドステートメントの最適化 7.6.2 プリペアドステートメントに対する SQLインターフェイス 7.6.3 プリペアドステートメントの制限 7.7 ユーザー定義関数 7.8 プラグイン 7.9 文字セットと照合順序 7.9.1 MySQLは文字セットをどのように扱うか 7.9.2 文字セットと照合順序の選択 7.9.3 文字セットと照合順序がクエリに与える影響 7.10 全文検索 7.10.1 自然言語の全文検索 7.10.2 ブーリアン全文検索 7.10.3 MySQL 5.1以降での全文検索の変更点 7.10.4 全文検索のトレードオフと次善策 7.10.5 全文インデックスの調整と最適化 7.11 分散(XA)トランザクション 7.11.1 内部 XAトランザクション 7.11.2 外部 XAトランザクション 7.12 MySQLクエリキャッシュ 7.12.1 MySQLがキャッシュヒットをチェックする方法 7.12.2 キャッシュはメモリをどのように使用するか 7.12.3 クエリキャッシュが役立つ状況 7.12.4 クエリキャッシュの調整と管理の方法 7.12.5 InnoDBとクエリキャッシュ 7.12.6 一般的なクエリキャッシュの最適化 7.12.7 クエリキャッシュに代わるもの 7.13 まとめ 8章 サーバー設定の最適化 8.1 MySQLの設定の仕組み 8.1.1 構文、スコープ、動的な変数 8.1.2 変数設定の副作用 8.1.3 変数を設定するための準備 8.1.4 ベンチマークによる反復的な最適化 8.2 何をしてはならないか 8.3 MySQLの設定ファイルの作成 8.3.1 MySQLサーバーの状態変数を調べる 8.4 メモリ使用量の設定 8.4.1 MySQLが使用できるメモリの量 8.4.2 接続ごとのメモリの需要 8.4.3 オペレーティングシステムのためのメモリを確保する 8.4.4 キャッシュのためのメモリを割り当てる 8.4.5 InnoDBのバッファプール 8.4.6 MyISAMのキーキャッシュ 8.4.7 スレッドキャッシュ 8.4.8 テーブルキャッシュ 8.4.9 InnoDBのデータディクショナリ 8.5 MySQLの I/Oの調整 8.5.1 InnoDBの I/Oの調整 8.5.2 MyISAMの I/Oの調整 8.6 MySQLの並行性の調整 8.6.1 InnoDBの並行性の調整 8.6.2 MyISAMの並行性の調整 8.7 ワークロードベースの設定 8.7.1 BLOBワークロードと TEXTワークロードのための最適化 8.7.2 ファイルソートのための最適化 8.8 基本設定の完了 8.9 安全性と健全性の設定 8.10 InnoDBの高度な設定 8.11 まとめ 9章 オペレーティングシステムとハードウェアの最適化 9.1 MySQLのパフォーマンスを制限するもの 9.2 MySQLに合わせて CPUを選択する方法 9.2.1 CPUの速さか、 CPUの数か 9.2.2 CPUアーキテクチャ 9.2.3 複数の CPUとコアへの拡張 9.3 メモリリソースとディスクリソースのバランス 9.3.1 ランダム I/Oとシーケンシャル I/O 9.3.2 キャッシュ、読み取り、書き込み 9.3.3 作業セットは何か 9.3.4 メモリとディスクの効果的な割合の検出 9.3.5 ハードディスクの選択 9.4 ソリッドステートストレージ 9.4.1 フラッシュメモリの概要 9.4.2 フラッシュテクノロジー 9.4.3 フラッシュストレージのベンチマーク 9.4.4 SSD 9.4.5 PCIeストレージデバイス 9.4.6 その他のソリッドステートストレージ 9.4.7 フラッシュを使用する状況 9.4.8 Flashcacheの使用 9.4.9 ソリッドステートストレージに合わせたMySQLの最適化 9.5 レプリカのためのハードウェアの選択 9.6 RAIDのパフォーマンスの最適化 9.6.1 RAIDの障害、復元、監視 9.6.2 ハードウェアRAIDとソフトウェアRAIDのバランス 9.6.3 RAID設定とRAIDキャッシュ 9.7 SANと NAS 9.7.1 SANのベンチマーク 9.7.2 NFSまたはSMB経由で SANを使用する 9.7.3 SANでのMySQLのパフォーマンス 9.7.4 SANを使用すべきか 9.8 複数のディスクボリュームの使用 9.9 ネットワーク設定 9.10 オペレーティングシステムの選択 9.11 ファイルシステムの選択 9.12 ディスクキュースケジューラの選択 9.13 スレッディング 9.14 スワッピング 9.15 オペレーティングシステムの状態 9.15.1 vmstatの出力の読み方 9.15.2 iostatの出力の読み方 9.15.3 その他の便利なツール 9.15.4 CPUバウンドのマシン 9.15.5 I/Oバウンドのマシン 9.15.6 スワッピングマシン 9.15.7 アイドルマシン 9.16 まとめ 10章 レプリケーション 10.1 レプリケーションの概要 10.1.1 レプリケーションによって解決される問題 10.1.2 レプリケーションの仕組み 10.2 レプリケーションのセットアップ 10.2.1 レプリケーションアカウントの作成 10.2.2 マスターとレプリカの設定 10.2.3 レプリカの開始 10.2.4 別のサーバーからのレプリカの初期化 10.2.5 推奨されるレプリケーション設定 10.3 レプリケーションの裏側 10.3.1 ステートメントベースのレプリケーション 10.3.2 行ベースのレプリケーション 10.3.3 ステートメントベースか行ベースかの選択 10.3.4 レプリケーションファイル 10.3.5 他のレプリカへのレプリケーションイベントの送信 10.3.6 レプリケーションフィルタ 10.4 レプリケーショントポロジ 10.4.1 マスターと複数のレプリカ 10.4.2 アクティブ/アクティブモードでのマスター/マスターレプリケーション 10.4.3 アクティブ/パッシブモードでのマスター/マスターレプリケーション 10.4.4 複数のレプリカを持つマスター /マスターレプリケーション 10.4.5 リングレプリケーション 10.4.6 マスター、分散マスター、レプリカ 10.4.7 ツリーまたはピラミッド 10.4.8 カスタムレプリケーションソリューション 10.5 レプリケーションとキャパシティの計画 10.5.1 レプリケーションが書き込みのスケーラビリティに役立たない理由 10.5.2 レプリカが遅れ始める状況 10.5.3 利用率を抑える計画 10.6 レプリケーションの管理とメンテナンス 10.6.1 レプリケーションの監視 10.6.2 レプリケーションの遅延の計測 10.6.3 レプリカとマスターの一貫性の確認 10.6.4 マスターからのレプリカの再同期 10.6.5 マスターの変更 10.6.6 マスター/マスター構成での役割の切り替え 10.7 レプリケーションの問題点と解決策 10.7.1 データの破壊または損失によるエラー 10.7.2 非トランザクショナルテーブルの使用 10.7.3 トランザクショナルテーブルと非トランザクショナルテーブルの混在 10.7.4 非決定的なステートメント 10.7.5 マスターとレプリカでストレージエンジンが異なる 10.7.6 レプリカでのデータの変更 10.7.7 一意でないサーバー ID 10.7.8 未定義のサーバー ID 10.7.9 レプリケートされていないデータへの依存 10.7.10 一時テーブルの損失 10.7.11 レプリケートする更新の選択 10.7.12 InnoDBのSelectロックによるロックの競合 10.7.13 マスター/マスターレプリケーションでの両方のマスターへの書き込み 10.7.14 レプリケーションの過度の遅延 10.7.15 マスターからの特大パケット 10.7.16 レプリケーションの帯域幅の制限 10.7.17 ディスク領域の不足 10.7.18 レプリケーションの制限 10.8 レプリケーションの速度 10.9 MySQLレプリケーションの高度な機能 10.10 その他のレプリケーションテクノロジー 10.11 まとめ 11章 MySQLのスケーリング 11.1 スケーラビリティとは 11.1.1 正式な定義 11.2 MySQLのスケーリング 11.2.1 スケーラビリティの計画 11.2.2 スケーリング前の時間稼ぎ 11.2.3 スケールアップ 11.2.4 スケールアウト 11.2.5 統合によるスケーリング 11.2.6 クラスタ化によるスケーリング 11.2.7 スケールバック 11.3 負荷分散 11.3.1 直接接続 11.3.2 プロキシの導入 11.3.3 1つのマスターと複数のレプリカによる負荷分散 11.4 まとめ 12章 高可用性 12.1 高可用性とは 12.2 ダウンタイムの原因 12.3 高可用性の実現 12.3.1 MTBFの改善 12.3.2 MTTRの改善 12.4 SPOFの回避 12.4.1 共有ストレージとディスクレプリケーション 12.4.2 同期レプリケーション 12.4.3 レプリケーションに基づく冗長性 12.5 フェイルオーバーとフェイルバック 12.5.1 レプリカの昇格または役割の切り替え 12.5.2 仮想 IPアドレスまたは IPアドレスの引き継ぎ 12.5.3 仲介ソリューション 12.5.4 アプリケーションでのフェイルオーバーの処理 12.6 まとめ 13章 クラウドでの MySQL 13.1 クラウドの長所、短所、迷信 13.2 クラウドでのMySQLの経済性 13.3 クラウドでのMySQLのスケーリングと HA 13.4 4つの基本リソース 13.5 クラウドホスティングでのMySQLのパフォーマンス 13.5.1 クラウドでのMySQLのベンチマーク 13.6 MySQL DBaaS 13.6.1 Amazon RDS 13.6.2 その他のDBaaSソリューション 13.7 まとめ 14章 アプリケーションレベルの最適化 14.1 一般的な問題 14.2 Webサーバーの問題 14.2.1 最適な並行性の模索 14.3 キャッシュ 14.3.1 アプリケーションよりも低いレベルでのキャッシュ 14.3.2 アプリケーションレベルのキャッシュ 14.3.3 キャッシュ制御ポリシー 14.3.4 キャッシュオブジェクト階層 14.3.5 コンテンツの事前生成 14.3.6 インフラストラクチャコンポーネントとしてのキャッシュ 14.3.7 HandlerSocketと memcachedアクセスの使用 14.4 MySQLの拡張 14.5 MySQLに代わるもの 14.6 まとめ 15章 バックアップとリカバリ 15.1 バックアップする理由 15.2 リカバリ要件の定義 15.3 MySQLのバックアップソリューションの設計 15.3.1 オンラインバックアップとオフラインバックアップ 15.3.2 論理バックアップとローバックアップ 15.3.3 何をバックアップするか 15.3.4 ストレージエンジンと一貫性 15.3.5 レプリケーション 15.4 バイナリログの管理とバックアップ 15.4.1 バイナリログのフォーマット 15.4.2 古いバイナリログの安全なパージ 15.5 データのバックアップ 15.5.1 論理バックアップの作成 15.5.2 ファイルシステムのスナップショット 15.6 バックアップからのリカバリ 15.6.1 ローファイルの復元 15.6.2 論理バックアップの復元 15.6.3 PITR 15.6.4 より高度なリカバリ手法 15.6.5 InnoDBのクラッシュリカバリ 15.7 バックアップツールとリカバリツール 15.7.1 MySQL Enterprise Backup 15.7.2 Percona XtraBackup 15.7.3 mylvmbackup 15.7.4 Zmanda Recovery Manager 15.7.5 mydumper 15.7.6 mysqldump 15.8 バックアップのスクリプト化 15.9 まとめ 16章 MySQLユーザーのためのツール 16.1 インターフェイスツール 16.2 コマンドラインユーティリティ 16.3 SQLユーティリティ 16.4 監視ツール 16.4.1 オープンソースの監視ツール 16.4.2 有償の監視システム 16.4.3 Innotopを使ったコマンドラインでの監視 16.5 まとめ 付録A MySQLから派生した製品 A.1 Percona Server A.2 MariaDB A.3 Drizzle A.4 その他の派生製品 A.5 まとめ 付録B MySQLサーバーの状態 B.1 システム変数 B.2 SHOW STATUS B.2.1 スレッドと接続の統計値 B.2.2 バイナリログの状態 B.2.3 コマンドカウンタ B.2.4 一時ファイルと一時テーブル B.2.5 ハンドラ操作 B.2.6 MyISAMのキーバッファ B.2.7 ファイルディスクリプタ B.2.8 クエリキャッシュ B.2.9 SELECTの種類 B.2.10 ソート B.2.11 テーブルロック B.2.12 InnoDB固有の変数 B.2.13 プラグイン固有の変数 B.3 SHOW ENGINE INNODB STATUS B.3.1 見出し B.3.2 SEMAPHORES B.3.3 LATEST FOREIGN KEY ERROR B.3.4 LATEST DETECTED DEADLOCK B.3.5 TRANSACTIONS B.3.6 FILE I/O B.3.7 INSERT BUFFER AND ADAPTIVE HASH INDEX B.3.8 LOG B.3.9 BUFFER POOL AND MEMORY B.3.10 ROW OPERATIONS B.4 SHOW PROCESSLIST B.5 SHOW ENGINE INNODB MUTEX B.6 レプリケーションの状態 B.7 INFORMATION_SCHEMA B.7.1 InnoDBのテーブル B.7.2 Percona Serverのテーブル B.8 Performance Schema B.9 まとめ 付録C 大きなファイルの転送 C.1 ファイルのコピー C.1.1 安直な方法 C.1.2 ワンステップの方法 C.1.3 暗号化のオーバーヘッドの回避 C.1.4 その他のオプション C.2 ファイルのコピーのベンチマーク 付録D EXPLAINの使用 D.1 EXPLAINの実行 D.1.1 非 SELECTクエリの書き換え D.2 EXPLAINの列 D.2.1 id列 D.2.2 select_type列 D.2.3 table列 D.2.4 type列 D.2.5 possible_keys列 D.2.6 key列 D.2.7 key_len列 D.2.8 ref列 D.2.9 rows列 D.2.10 .ltered列 D.2.11 Extra列 D.3 ツリー形式の出力 D.4 MySQL 5.6の改善点 付録E ロックのデバッグ E.1 サーバーレベルでのロック待ち E.1.1 テーブルロック E.1.2 グローバル読み取りロック E.1.3 名前ロック E.1.4 ユーザーロック E.2 InnoDBでのロック待ち E.2.1 INFORMATION_SCHEMAテーブルの使用 付録F MySQLでの Sphinxの使用 F.1 一般的な Sphinx検索 F.2 Sphinxを使用する理由 F.2.1 効率的でスケーラブルな全文検索 F.2.2 WHERE句の効率的な適用 F.2.3 結果を上位のものから順に検索する F.2.4 GROUP BYクエリの最適化 F.2.5 結果セットの並行生成 F.2.6 スケーリング F.2.7 シャードデータの集計 F.3 アーキテクチャの概要 F.3.1 インストールの概要 F.3.2 パーティションの一般的な用途 F.4 特別な機能 F.4.1 フレーズ近傍ランキング F.4.2 属性のサポート F.4.3 フィルタリング F.4.4 SphinxSEストレージエンジン F.4.5 高度なパフォーマンス制御 F.5 実装の実例 F.5.1 Mininova.orgの全文検索 F.5.2 BoardReader.comでの全文検索 F.5.3 Sahibinden.comでの選択の最適化 F.5.4 BoardReader.comでの GROUP BYの最適化 F.5.5 Grouply.comでのシャード結合クエリの最適化 F.6 まとめ 索引