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. メイン設定ファイルを書く3. サブ構成ファイ...
Centos6にZLMediaKitをインストールするZLMediaKit の作者は Ubuntu ...
目次序文コア - キャンセルトークン実用的なアプリケーションとパッケージングいくつかの小さな詳細序文...
目次1. シナリオ2. サンドボックスの基本機能3. iframeの実装4. Webワーカーの実装5...
1. es起動コマンド: docker run -itd -e TAKE_FILE_OWNERSHI...
さっそく、レンダリングを見てみましょうソースコードは以下のとおりです <!DOCTYPE ht...
この記事のシナリオと組み合わせて、Nginx と Java 環境 (SpringBoot プロジェク...
1. SSHリモート管理SSH の定義SSH (Secure Shell) は、主にキャラクタ イン...
目次セットは値が重複しない特別なコレクションです。セットコレクション基本API独自の価値判断セットを...
Linux では、通常、ファイルの名前を変更するために mv コマンドを使用します。これは、単一のフ...
目次uni-app のスタイル要約するuni-app のスタイルsassプラグインは公式ウェブサイト...
国内のネットワーク環境が悪化し続ける中、さまざまな改ざんや乗っ取りが後を絶たず、サイト全体をHTTP...
シンプルな機能: ブラウザの右上隅にあるプラグイン アイコンをクリックすると小さなポップアップ ウィ...
コンテナの起動コマンドを取得する方法コンテナはすでに作成されていますが、その起動パラメータ(データが...