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アーキテクチャのコンセプト - それは人によって異なり、ベストなものはなく、適切なものだけがある
この記事は共有および集約することを歓迎します。全文を転載する必要はありません。著作権を尊重してくださ...
Dockerコンテナ接続1. ネットワークポートマッピングPythonアプリケーション用のコンテナを...
1. 自然なレイアウト<br />レイアウトは変更せずに自動的に左揃えになります。 2....
目次質問:ケース(1)子スレッドを作成する前にフォークするケース(2)子スレッドを作成した後にフォー...
MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...
私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思...
1. テストテーブルを作成する テーブル `testsign` を作成します ( `userid`...
先ほど使用したDocker HubはDockerによって提供されています。独自のDockerを構築す...
目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...
1. コマンドの紹介bzip2 は、ファイルの圧縮と解凍に使用されます。これは、Linux システム...
この記事では、弾幕効果を実現するためのネイティブjsの具体的なコードを参考までに共有します。具体的な...
1つ。 tomcat を使用したリモート展開1.1 発生した問題:プロジェクトでは、サードパーティの...
目次概要Canvas API: グラフィックスの描画パス線種矩形アーク文章グラデーションと画像の塗り...
目次1. セットとは何か2. セットコンストラクタ2.1) 配列2.2) 文字列2.3) 議論2.4...
MySQL は、マルチテーブルクエリを実行するときにエラーを報告します。 [SQL] SELECT ...