Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  非永続的オプティマイザ統計のパラメータの構成

14.13.16.2 非永続的オプティマイザ統計のパラメータの構成

MySQL 5.6.6 の時点では、オプティマイザ統計はデフォルトで永続的であり、innodb_stats_persistent 構成オプションで有効になります。このセクションでは、innodb_stats_persistent=OFF であるとき、または STATS_PERSISTENT=0 で個々のテーブルが作成または変更されるときに適用される非永続的オプティマイザ統計の構成について説明します。永続的オプティマイザ統計については、セクション14.13.16.1「永続的オプティマイザ統計のパラメータの構成」を参照してください。

MySQL クエリーオプティマイザは、インデックスの相対的な選択性に基づいて、キー分布に関する推定された統計を使用して実行計画のためのインデックスを選択します。特定の操作を行うと、InnoDB は、インデックスのカーディナリティーを推定するためにテーブル上の各インデックスからランダムなページをサンプリングします。(この手法は、ランダムダイブと呼ばれます。)これらの操作には、ANALYZE TABLE ステートメント、SHOW TABLE STATUS ステートメント、および再起動後のテーブルへのはじめてのアクセスが含まれます。

統計の推定値の品質を制御する (それにより、クエリーオプティマイザへの情報を改善する) ために、パラメータ innodb_stats_transient_sample_pages を使用して、サンプリングされるページの数を変更できます。サンプリングされるページのデフォルト数は 8 です。これは、正確な推定値を生成するには十分ではなく、クエリーオプティマイザによる不適切なインデックス選択につながる可能性があります。この手法は、大きなテーブルや、結合で使用されるテーブルの場合に特に重要です。このようなテーブルに対する不必要なフルテーブルスキャンが、パフォーマンスの重大な問題になる場合があります。このようなクエリーのチューニングに関するヒントについては、セクション8.2.1.20「フルテーブルスキャンを回避する方法」を参照してください。

グローバルパラメータ innodb_stats_transient_sample_pages は、実行時に設定できます。

注記

innodb_stats_persistent=0 である場合は、innodb_stats_transient_sample_pages の値がすべての InnoDB テーブルおよびインデックスのインデックスサンプリングに影響を与えます。インデックスのサンプルサイズを変更すると、次の潜在的に重大な影響が発生します。

  • 1 や 2 などの小さな値では、カーディナリティーの不正確な推定値が生成される可能性があります。

  • innodb_stats_transient_sample_pages 値を大きくすると、必要なディスク読み取りが増える可能性があります。8 よりはるかに大きい値 (たとえば、100) では、テーブルを開いたり、SHOW TABLE STATUS を実行したりするための速度が大幅に遅くなる可能性があります。

  • オプティマイザが、インデックスの選択性の異なる推定値に基づいて、非常に異なるクエリー計画を選択する可能性があります。

SHOW TABLE STATUSSHOW INDEX などのメタデータステートメントの実行時や、INFORMATION_SCHEMA.TABLES または INFORMATION_SCHEMA.STATISTICS テーブルへのアクセス時に統計が更新されるようにするには、ステートメント SET GLOBAL innodb_stats_on_metadata=ON (または 0) を実行します。

注記

永続的オプティマイザ統計が MySQL 5.6.6 でデフォルトで有効になったとき、innodb_stats_on_metadata のデフォルト設定は OFF に変更されました。この変数を有効にすると、多数のテーブルまたはインデックスを含むスキーマへのアクセス速度が低下したり、InnoDB テーブルに関するクエリーの実行計画の安定性が低下したりする可能性があります。

--auto-rehash 設定がオン (デフォルト) の状態で mysql クライアントが起動されると、すべての InnoDB テーブルが開かれ、関連付けられたすべてのインデックスの統計がふたたび推定されます。mysql クライアントの起動時間を改善するために、--disable-auto-rehash オプションを使用して auto-rehash をオフにすることができます。auto-rehash 機能は、対話ユーザーのためのデータベース、テーブル、およびカラム名の自動名前補完を有効にします。

あるシステムで innodb_stats_transient_sample_pages のどのような値が最適に機能したとしても、このオプションを設定し、その値のままにします。過剰な I/O を必要とせずに、データベース内のすべてのテーブルに対して適度に正確な推定値を生成する値を選択してください。統計は ANALYZE TABLE の実行時以外のさまざまな時間に自動的に再計算されるため、インデックスのサンプルサイズを増やし、ANALYZE TABLE を実行してから、サンプルサイズをふたたび減らしても意味がありません。innodb_stats_transient_sample_pages の大きな値で実行されている ANALYZE によって計算されたより正確な統計があとで消去される可能性があります。

小さなテーブルは一般に、大きなテーブルに比べて、必要なインデックスサンプルが少なくなります。データベースに多数の大きなテーブルが含まれている場合は、ほとんどが小さなテーブルである場合より大きな innodb_stats_transient_sample_pages 値を使用することを考慮してください。