MySQLの遅いクエリ問題の詳細な分析データ送信

MySQLの遅いクエリ問題の詳細な分析データ送信

例を通して、MySQL のデータ テーブル送信のクエリが遅い問題の解決策を共有しました。

最近、コードの最適化中に、SQL ステートメントが非常に遅いことがわかったので、さまざまな方法を使用して調査し、ようやく原因を見つけました。

1. 事故現場

og.goods_barcode、og.color_id、og.size_id、SUM(og.goods_number) AS sold_number FROM order o を選択 
LEFT JOIN order_goods og ON o.order_id = og.order_id WHERE o.is_send = 0 AND o.shipping_status = 0 
AND o.create_time > '2017-10-10 00:00:00' AND o.ck_id = 1 AND og.goods_id = 13421 AND o.is_separate = 1 AND o.order_status IN (0, 1) AND og.is_separate = 1 
og.color_id、og.size_id でグループ化

上記のステートメントは、結合テーブル グループ化クエリ ステートメントです。

実行結果:

このステートメントには1.300秒かかり、 Sending data1.28秒かかり、時間のほぼ 99% を占めていることがわかります。そのため、これを最適化します。

どのように最適化するのでしょうか?

2. SQL文の分析のための3つのコツ

1. 分析を説明する

上記の文explain

説明 SELECT og.goods_barcode, og.color_id, og.size_id, SUM(og.goods_number) AS sold_number FROM order o 
LEFT JOIN order_goods og ON o.order_id = og.order_id WHERE o.is_send = 0 AND o.shipping_status = 0 
AND o.create_time > '2017-10-10 00:00:00' AND o.ck_id = 1 AND og.goods_id = 13421 AND o.is_separate = 1 AND o.order_status IN (0, 1) AND og.is_separate = 1 
og.color_id、og.size_id でグループ化

実行結果:

explainを通じて、上記のステートメントがインデックスkeyを使用していることがわかります。

2. プロセスリストを表示する

説明しても問題は明らかにならないので、何が遅いのでしょうか?

そこで、 show processlistを使用して SQL ステートメントの実行ステータスを表示することを考えました。クエリ結果は次のとおりです。

クエリが長時間「データ送信中」状態であったことが判明しました。

「データ送信中」ステータスの意味を調べてください。このステータスの名前は非常に誤解を招くものであることがわかります。いわゆる「データ送信中」は単にデータを送信するのではなく、「データの収集 + 送信」が含まれます。

ここで重要なのは、なぜデータを収集する必要があるかということです。その理由は、MySQL が「インデックス」を使用してクエリを完了した後、MySQL が一連の行 ID を取得するためです。一部の列がインデックスにない場合、MySQL は「データ行」に戻って返されるデータを読み取り、クライアントに返す必要があります。

3. プロフィールを表示

クエリの時間分布をさらに検証するには、 show profileコマンドを使用して詳細な時間分布を表示します。

まず設定を開きます: set profiling=on;

クエリを実行した後、show profiles を使用してクエリ ID を表示します。

詳細情報を表示するには、クエリ query_id の show profile を使用します。

3. トラブルシューティングと最適化

1. 確認して比較する

上記の手順を実行すると、クエリが遅いのは、データ送信ステータスに多くの時間が費やされているためであることが判明しました。データ送信の定義と組み合わせて、ターゲットはクエリ ステートメントの戻り列に焦点が当てられます。

一つずつ確認した後、最終的に説明欄に配置することにしました。この欄のデザインは、 description varchar(8000) DEFAULT NULL COMMENT 'ゲームの説明'、

そこで、私たちは「説明を返さない結果」がどのようになるかを見るために比較アプローチを採用しました。ショープロフィールの結果は以下のとおりです。

【解決】

問題の根本原因が見つかれば、解決は難しくありません。いくつかの方法があります:

1) 検索時に説明クエリを削除しますが、これはビジネスの実装によって制限され、ビジネスに大きな調整が必要になる場合があります。

2) テーブル構造を最適化し、記述を別のテーブルに分割します。これは大きな変更であり、既存のビジネスが変更に協力する必要があります。ビジネスが引き続きこの記述の情報のクエリを実行する必要がある場合、最適化後のパフォーマンスは大幅に向上しません。

以下もご興味があるかもしれません:
  • MySQL 5.7 のスロークエリログの時間がシステム時間より 8 時間遅れている理由の詳細な説明
  • MySQLクエリ速度が遅く、パフォーマンスが低下する原因と解決策
  • MySQLクエリが遅い原因と解決策
  • MySQLクエリが遅い場合の理由と解決策
  • MySQL でスロークエリログ機能を有効にする方法
  • MySQL IN ステートメントにおける低速クエリの効率を最適化する手法の例
  • MySQL でスロークエリログを有効にする方法
  • MySQL のスロークエリの方法と例

<<:  Linux システムで tcpdump を使用してパケットをキャプチャする方法

>>:  Vueはグラフィック検証コードを実装する

推薦する

geo モジュールを使用して Nginx でホワイトリストを設定する例

元の構成: http { ...... limit_conn_zone $binary_remote...

Linux7で仮想ホストを実装する3つの方法

1. 同じIPアドレス、異なるポート番号仮想ホスト 1: ホスト IP アドレスは 172.16.3...

Ubuntu 18.04 MySQL 8.0 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0のインストールと設定方法を参考までに紹介します。具体的な内容は以下の...

重要なmysqlログファイルの概要

著者: 丁易出典: https://chengxuzhixin.com/blog/post/mysq...

アニメーションとトランジションの違い

CSS3アニメーションとJSアニメーションの違いJSはフレームアニメーションを実装しますCSS3はト...

MySQL 結合クエリの原則の知識ポイント

MySQL 結合クエリ1. 基本概念2 つのテーブルの各行をペアで水平に接続して、すべての行の結果を...

JS での filter() 配列フィルターの使用

目次1. はじめに2. 方法の紹介3. 使用例要約する1. はじめに配列フィルターは、フロントエンド...

Ubuntu の MySQL のパラメータ ファイル my.cnf の詳細な分析

序文MySQL に関する私の理解に基づくと、パフォーマンスの最適化作業やマスター スレーブ レプリケ...

Node.js の非同期イテレータの詳細な説明

目次序文非同期イテレータとは何ですか?非同期イテレータストリームとしてページング機能を備えたAPIの...

純粋な CSS 実装 (スクリプトなし) HTML コマンド スタイルのツールチップ テキスト プロンプト効果

実行プロセスを分析します。マウスをノードに移動して、ノードにツールチップ実装を開くための識別子 (...

JDBC を使用して MySQL を操作するための簡単な分析では、Class.forName("com.mysql.jdbc.Driver") を追加する必要があります。

導入データベースに接続するためにJDBCを使用することに慣れている場合は、データベースに接続するため...

jsを呼び出すいくつかの方法が整理され、使用が推奨されています

a タグではクリック イベントがよく使用されます。 1. href="javascript...

ウェブサイトを構築するときは、UTF-8 または GB2312 エンコードを使用する必要がありますか?

外国のウェブサイトを開くと文字化けした文字が表示されることが多く、また、英語以外の外国のウェブサイト...

JavaScript でフロントエンドのカウントダウン効果を実装する

この記事では、フロントエンドのカウントダウン効果を実現するためのJavaScriptの具体的なコード...

MySQLデータベースのタイムアウト設定を構成する方法の例

目次序文1. JDBCタイムアウト設定2. 接続プールのタイムアウト設定3. MyBatisクエリの...