ストレージエンジンはオプティマイザに使用されるテーブルの統計を集めます。テーブル統計は値グループに基づき、値グループは同じキープリフィックス値を持つ行のセットです。オプティマイザの目的に関しては、標準グループサイズは重要な統計となります。
MySQLは標準値グループサイズを以下のように使用します。
各refアクセスごとに読まれなければならない行の数を推測
一部 joinが生成する行の数を推測するため:つまり、このフォームのオペレーションが生成する行の数になります。
(...) JOINtbl_nameONtbl_name.key=expr
インデックスの標準値グループサイズが増加する毎に、その2つの目的に関してはインデックスは役に立たなくなります。というのも、ルックアップあたりの標準行数は増加するためです。最適化の目的のためにインデックスが有用であるため、各インデックス値はターゲットとするテーブル内の行の数は少なくなければいけません。既存のインデックス値が大量の行を生成する際、インデックスは役に立たなくなり、MySQLはそれを使用しなくなります。
標準値グループサイズはテーブルカーディナリティと関連しています。これは値グループの数を指します。SHOW
INDEXステートメントはN/Sに基づくカーディナリティ値を表示します。これはNがテーブル内の行数であり、Sが標準値グループサイズとなります。その比率はテーブル内の値グループの概数を生成します。
<=>
比較演算子に基づくjoinに対して、
NULLは他の値と同様に扱われます。
NULL <=>
NULL、ちょうどが他のN
<=>
NNであるように。
ただし、=演算子に基づくjoinに対して、NULLは非NULL値と異なります。はexpr1
=
expr2expr1あるいはexpr2(もしくは両方)がNULLである場合、適切ではありません。このことは、フォームの比較に対するtbl_name.key
=
exprrefアクセスに影響を与えます。exprの現在値がNULLの場合、MySQLはテーブルにアクセスしません。というのも、比較は適切でないからです。
=比較に対して、NULL値の数がテーブル上にいくらであっても、関係ありません。最適化のためには、関連する値は非NULL値グループの標準サイズにします。ただし、現在MySQLは標準サイズを収集もしくは使用することを許可しません。
MyISAMテーブルに対して、myisam_stats_methodシステム変数を使用することで、テーブル統計コレクションが管理されます。この変数には2つの可能値があり、これらは以下のとおり異なります。
myisam_stats_methodがnulls_equalの場合、全てのNULL値は等価として扱われます。(つまり、それらは全てシングル値グループを形成します。)
NULL値グループサイズは標準非NULL値グループサイズよりはるかに大きくなります。このメソッドは標準値グループサイズを大きくゆがませます。これによりオプティマイザから見たインデックスは非NULL値を検索するjoinに対して役に立たないように見えます。結果的に、nulls_equalメソッドはオプティマイザにrefアクセスに対してインデックスを使用すべきときでも使用しないままにする可能性があります。
myisam_stats_methodがnulls_unequalの時、NULL値は等価として扱われません。代わりに、各NULL値はサイズ1の別値グループを生成します。
NULL値が多い場合、このメソッドは標準値グループサイズを小さくゆがませます。もし標準非NULL値グループサイズが大きい場合、NULL値をサイズ1のグループとして取り扱うと、オプティマイザに非NULL値を探させるjoinのインデックス値を過大評価します。結果的に、nulls_unequalメソッドは、他のメソッドの方が適しているにもかかわらず、オプティマイザにこのインデックスをrefルックアップに使用させることがあるかもしれません。
=よりも<=>を使用するjoinを多くユーザが使用している場合、NULL値は比較では特別ではなく、1つのNULLは他のものと等価です。この場合、nulls_equalは適切な統計メソッドです。
myisam_stats_methodシステム変数はグローバルとセッション値を保持しています。グローバル値の設定はMyISAMテーブルに対するMyISAM統計収集に影響を与えます。
セッション値を設定することで、現在のクライント接続のみに対する統計収集に影響が与えられます。これは、既存のメソッドで他のクライントに影響を与えず、テーブルの統計をセッション値myisam_stats_methodに設定することで再生することが可能です。
テーブル統計を再生するために、以下のメソッドを使用してください。
myisam_stats_methodを設定し、CHECK
TABLEステートメントを発行します。
myisamchk
--stats_method=method_name
--analyzeを実行します。
テーブルを変更し統計を旧値とし(例えば、行を挿入し、それから削除します)、そしてmyisam_stats_methodを設定しANALYZE
TABLEステートメントを発行します。
myisam_stats_methodの使用に関する警告。
以下で説明されているように、強制的にテーブル統計を明示的に収集させることができます。ただし、MySQLも自動的に統計を収集する可能性があります。例えば、テーブルステートメント実行時、ステートメントの中にはテーブルを改良するものもあり、MySQLは統計を収集する可能性があります。(例えば、これは大量挿入や削除時、もしくはALTER
TABLEステートメントの際に起こる可能性があります。)これが生じた場合、統計はmyisam_stats_methodがその時々で持っている値を使用して統計が収集されます。よって、あるメソッドで統計を収集したがmyisam_stats_methodが自動的にテーブル統計が収集された後他のメソッドに設定されている場合、他のメソッドが使用されます。
既存のMyISAMテーブルに対してどのメソッドが統計生成に使用されたかを知ることはできません。
myisam_stats_methodはMyISAMテーブルにのみ適用されます。他のストレージエンジンはテーブル統計を収集するメソッドが1つしかありません。通常は、nulls_equalメソッドに近いです。
