2017-05-19 14 views
3

私は最近、EXPLAIN MySQLクエリの計画が劇的に変更され、クエリ実行時間に悪影響を及ぼしているという問題に遭遇しました。この問題を解決するために、innodb_stats_sample_pageをMySQLのデフォルトの8から増やすことを検討しました。私の検索では、これを行う際の賛否両論に関する文献と、その変数に最適な値を選択する方法、しかし、私はについて何も説明が見つかりませんでした。sample pageです。MySQL:サンプルページとは何ですか?

彼らの目的は明確である:

MySQLのクエリオプティマイザは、インデックスの相対的な選択に基づいて、実行計画のインデックスを選択することが重要なディストリビューションについての推定の統計を使用しています。ある種の演算では、InnoDBはテーブルの各インデックスのランダムページをサンプリングしてインデックスのカーディナリティを推定します。これらの操作には、ANALYZE TABLE文、SHOW TABLE STATUS文、および再起動後に初めて表にアクセスする操作が含まれます。

そのpageは、実際にはsample pageが何であるかを説明していません。だから、正確に何かsample pageですか? (InnoDBが時々代わりに「ブロック」と呼んでも)

+0

使用しているMySQLのバージョンはどれですか?最近この地域には大きな変化があった。 –

+0

バージョンは5.5 –

答えて

1

のInnoDB記憶は、一般 ある固定サイズのユニット内のすべてのレコードは、「ページ」と呼ばれます。 現在、すべてのページのサイズは同じですが、16KBです。

https://dev.mysql.com/doc/internals/en/innodb-page-structure.html

+0

です。サンプルに使用するページがどのように決定されたかは分かりますか? –

+0

docは「ランダム」と言っています.. so .. – scaisEdge

+0

自分自身で 'ANALYZE TABLE'を実行した場合、ページを変更せずに2回連続して実行すると、正確に同じページが両方の実行で使用されると仮定できますか?それとも100%無作為なので、私はそれを実行するたびにRNGesusに祈る必要がありますか? –

1

ページは、(単一のテーブルの)複数のレコードが格納されたメモリブロックで、索引付けアルゴリズムは、(任意のページに格納されている、すなわち、レコードをテーブルのランダムなページを取ることができますテーブル)を使用して、テーブル内のすべてのレコードについていくつか仮定します。したがって、各レコードを分析することなく、そのテーブル内の特定のインデックスを使用することがどれほど有益であるかを推測することができます。ページ/ブロック構造の詳細

なぜランダムページではなく、ランダムなレコードの

チェックdocumentationページは1回のメモリ操作でアクセスできる連続したメモリに格納されるため、メモリ操作では複数のレコードを取得できます。

どのページを分析するかはどのように決定されますか?他のページよりも良いサンプルである特定のページがないため、ページが取得されます。

私はそのテーブルのレコードを変更しないと常に同じページを選択しますか?いいえ、そうしないと、そのテーブルをサンプリングしようとするたびに別のランダムページが使用されます。しかし、レコード間に大きな違いがなければ、異なるサンプリングされたページは同じインデックスが使用される可能性があります。しかし、大きな違いがある場合(例えば、最初にテーブルが特定のフィールドに対してnullを持っていて、そのフィールドの半分がnullでない場合)、他のインデックスを使用できます。

関連する問題