1. 問題の説明最近、問題が発生しました。パーティション テーブルをデータ クエリ/ロードに使用すると、通常のテーブルと比較してパフォーマンスが約 50% 低下しました。主なボトルネックは CPU に発生しました。CPU のボトルネックであったため、 2. pt-pmapを使用したスタック分析
フォーマット後、アイドル待機スタックを削除したところ、上記のように大量の待機スタックが見つかりました。これは、perf top -a -g のパフォーマンスでも確認されました。 3. このコラムのボトルネックポイントの分析ここでは ha_innobase::build_template ->テンプレートフィールドの構築 ->dict_col_get_clust_pos ロジックはおおよそ次のようになります。
ここでは、実際には 2 つのループ層、つまりループ内のループ (時間計算量 O(M×N))があり、ループが 2 つの場所に最も大きな影響を与えていることがわかります。
ここが遅いのはそのためです。ただし、テンプレートは通常、クエリに対して複数回作成されることはありません。たとえば、共通テーブルの大規模なクエリは、ステートメントが初めてデータを検索する前にのみ作成されます。これは、パーティション テーブルと共通テーブルの比較における特別な点です。以下に説明させていただきます。 4. パーティションテーブル内のテンプレートの複数作成次のようなパーティション テーブルがあるとします。 テーブルtを作成する( id1 int, id2 整数、 主キー(id1)、 キー(id2) )エンジン=innodb 範囲(id1)でパーティション分割( パーティションp0の値が(100)未満の場合、 パーティションp1の値が(200)未満である、 パーティションp2の値が(300)未満である t値(1,1)に挿入します。 t値(101,1)に挿入します。 t値(201,1)に挿入します。 t値(2,2)に挿入します。 t値(3,2)に挿入します。 t値(4,2)に挿入します。 t値(7,2)に挿入します。 t値(8,2)に挿入します。 t値(9,2)に挿入します。 t値(10,2)に挿入します。 「 この方法では、パーティションごとに (m_prebuilt->sql_stat_start)の場合{ テンプレートをビルドします(false); } m_prebuilt->sql_stat_start は、ステートメントの先頭で true に設定されるだけでなく、次のようにパーティションが変更されるたびに true に設定されます。 ha_innopart::set_partition: ビルド済みの sql_stat_start を m_sql_stat_start_parts.test(part_id); 5. 特別なプロセスについて次のような、障害 このスタックは実際には完全ではありませんが、 id2<2 の場合、t から * を選択し、id2 で並べ替えます。 スタック: これは、id2 フィールドはパーティション内でデータがサイズ順にソートされることを保証するだけですが、テーブル全体では順序が乱れ、追加の処理が必要になるためです。 6. 問題のシミュレーションこれらの準備により、300 個のフィールドと 25 個のパーティションを持つパーティション テーブルを構築できます。最新のテストバージョンは8.0.26です テーブルtpar300col(を作成 id1 int, id2 整数、 id3 int、 id4 整数、 ... id299 varchar(20), id300 varchar(20)、 主キー(id1)、 キー(id2) )エンジン=innodb 範囲(id1)でパーティション分割( パーティションp0の値が(100)未満の場合、 パーティションp1の値が(200)未満である、 パーティションp3の値が(300)未満の場合、 ... パーティションp25の値が(2500)未満である tpar300col に値を挿入します (1,1,1, .... パーティションごとに1つのデータをtpar300col値(2401,1,1)に挿入します。 次に、他のデータ id2 を 1 以外に構築し、ストアド プロシージャを作成します。 区切り文字 // プロシージャ test300col() を作成します。 始める num int を宣言します。 数値を 1 に設定します。 num <= 1000000 の場合 id2=1 の場合、tpar300col から * を選択します。 num = num+1 を設定します。 終了しながら; 終わり // 埋め込む: /opt/mysql/mysql3340/install/mysql8/bin/mysql -S--socket=/opt/mysql/mgr3315/data/mgr3315.sock -e'use test;call test300col();' > log.log 次に、perf top は次のことを観察します。 これにより問題が確認されました。 VII. 結論この問題は、実際にはパーティション キーに対するセカンダリ インデックスのデータ分散に関係していますが、セカンダリ インデックスのデータを制御することはできず、インデックスを使用する必要があります。いくつかの方法で回避することしかできません。もちろん、次のようにバグも提出しました。 参考: この問題を解決する方法があるかどうかはわかりません。たとえば、パーティション化されたテーブルの場合、各パーティションのフィールドは実際には同じです。毎回
これで、MySQL パーティション テーブルのパフォーマンス バグに関するこの記事は終了です。MySQL パーティション テーブルのパフォーマンス バグの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Nginx イントラネット スタンドアロン リバース プロキシの実装
>>: 私のCSSアーキテクチャのコンセプト - それは人によって異なり、ベストなものはなく、適切なものだけがある
目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...
Reactのdiffアルゴリズムの理解diffアルゴリズムは、 Virtual DOMの変更された部...
この記事では、動的なテーブル効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...
LinuxリモートMySQLデータベースの展開、参考までに、具体的な内容は次のとおりです。 1.0 ...
Syn 攻撃は、最も一般的で最も簡単に悪用される攻撃方法です。TCP プロトコルの欠陥を利用して、偽...
新しい CSS 機能を使用する場合、その互換性は常に考慮されます。おそらく、その互換性、どのブラウザ...
この記事では、ログインタイプの切り替えを実装するためのVueの具体的なコードを例として紹介します。具...
目次序文1. 環境設定1.1 achartsをインストールする1.2 グローバル参照2. ドーナツチ...
オペレーティングシステム: Windows10 MySQL バージョン: 8.0.13-winx64...
# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...
序文誰もが日常業務で SQL の最適化を経験したことがあると思います。したがって、最適化の前に、遅い...
最近のプロジェクトでは、ポイントを集める効果を作成する必要があります。 ボスの説明によると、この効果...
まず、どのフィールドまたはフィールドの組み合わせがデータ行を一意に識別できるかを決定する必要がありま...
いつも、気づかないうちに時間というのは驚くほど早く過ぎていきます。小暑が過ぎ、中暑に突入しました。太...
Docker-machineはDockerが公式に提供しているDocker管理ツールです。これは d...