MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

8.3.8 InnoDB および MyISAM インデックス統計コレクション

ストレージエンジンはオプティマイザによって使用されるテーブルに関する統計を収集します。 テーブル統計は値グループに基づきますが、ここで値グループは同じキープリフィクス値を持つ行のセットです。 オプティマイザの目的で、重要な統計は平均値グループサイズです。

MySQL は平均値グループサイズを次のように使用します。

インデックスの平均値グループサイズが増えるほど、ルックアップあたりの平均行数が増えるため、それらの 2 つの目的でインデックスが役立たなくなります。インデックスが最適化の目的に役立つようにするには、各インデックス値でターゲットとするテーブル内の行を少なくすることがもっとも適切です。 指定したインデックス値が多数の行を生成する場合、そのインデックスはあまり役に立たず、MySQL がそれを使用する可能性は少なくなります。

平均値グループサイズは、値グループの数であるテーブルカーディナリティーと関連しています。 SHOW INDEX ステートメントは、N/S に基づいて、カーディナリティー値を表示します。ここで N はテーブル内の行数で、S は平均値グループサイズです。 その比率から、テーブル内の値グループの概数がわかります。

<=> 比較演算子に基づいた結合では、NULL の扱いはほかの値と異なりません。ほかのどの N に対しても N <=> N とまったく同じように、NULL <=> NULL です。

ただし、= 演算子に基づく結合では、NULLNULL 以外の値と異なります。expr1 または expr2 (または両方) が NULL である場合、expr1 = expr2 は true になりません。 これは、tbl_name.key = expr 形式の比較のための ref アクセスに影響: 比較は true にできないため、expr の現在の値が NULL の場合、MySQL はテーブルにアクセスしません。

= 比較では、テーブルにある NULL 値の数は問題になりません。 最適化の目的で、関連のある値は NULL 以外の値グループの平均サイズです。 ただし、MySQL では現在その平均サイズを収集したり、使用したりできません。

InnoDB および MyISAM テーブルでは、innodb_stats_method および myisam_stats_method システム変数をそれぞれ使用して、テーブル統計のコレクションに対していくらかの制御ができます。 これらの変数には、3 つの可能性のある値を使用でき、次のように異なります。

= より <=> を使用する多くの結合を使用する傾向がある場合、比較で NULL 値は特別ではなく、NULL は互いに等しくなります。 この場合、nulls_equal は適切な統計メソッドです。

innodb_stats_method システム変数にはグローバル値があります。myisam_stats_method システム変数にはグローバル値とセッション値の両方があります。 グローバル値を設定すると、対応するストレージエンジンからのテーブルの統計収集に影響します。 セッション値を設定すると、現在のクライアント接続のみに対する統計収集に影響します。 つまり、myisam_stats_method のセッション値を設定することで、他のクライアントに影響を与えることなく、特定の方法でテーブル統計を強制的に再生成できます。

MyISAM テーブルの統計を再生成するには、次のいずれかの方法を使用できます:

innodb_stats_methodmyisam_stats_method の使用に関するいくつかの警告は次のとおりです。