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. HTTPGET 2. HTTP POSTウェブソケット4. Egretのhttpとwebs...
これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...
1. 背景最近、独立した開発者がUIデザインを行うのを支援するために、uideaというWebサイト...
前提条件Windows Server でコンテナーを実行するには、Windows Server (半...
1. シェルスクリプトを作成する vim バックアップdb.sh 次のようにスクリプトを作成します。...
今回は、実行中のコンテナをイメージにパッケージ化して Alibaba Cloud にアップロードし、...
目次1. 環境整備2. イメージを実行する問題を解決するRedis のインストールNginx のイン...
トランジションドキュメントアドレスは、フェードインとフェードアウト効果を実現するための背景ポップアッ...
MySQLでは判定記号がよく使われますが、等しくない記号はもっと一般的に使われます。次の3つの等しく...
<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...
質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...
Black Duck の 2017 年のオープンソース調査では、回答者の 77% がオープンソース...
1. サブクエリMySQL 4.1以降はサブクエリをサポートしていますサブクエリ:別のクエリ内にネス...
例:ヒント:このコンポーネントはvue-cropperの二次パッケージに基づいていますプラグインをイ...
この効果はブラウザ ページで最もよく見られます。まずは効果の画像をご覧ください。 上の図に示すように...