MySQL クエリの最適化: クエリが遅い原因と解決策

MySQL クエリの最適化: クエリが遅い原因と解決策

開発に携わっている友人、特に MySQL に関係のある友人は、非常に遅い MySQL クエリに遭遇することがあります。もちろん、数十のエントリではなく、数百万または数千万の大量のデータを意味します。

クエリが遅い場合の解決策を見てみましょう

開発者は、インデックスや制限 n のないステートメントをチェックすることがよくあります。これらのステートメントは、データベースに大きな影響を与える可能性があります。たとえば、数千万件のレコードを含む大きなテーブルを完全にスキャンする必要がある場合や、ファイルソートを継続的に実行する必要がある場合は、データベースとサーバーの IO に影響します。ミラーライブラリの状況は次の通りです。

オンライン データベースに関しては、インデックスのないステートメントや制限のないステートメントに加えて、MySQL 接続が多すぎるという別の問題があります。これについて言えば、これまでの監視の実践を見てみましょう。

  1. Zabbix などのオープンソースの分散監視システムを導入して、毎日のデータベース IO、CPU、接続数を取得します。
  2. データ増加、iostat、vmstat、データサイズなどの週次パフォーマンス統計を展開します。
  3. MySQL スローログ コレクション、トップ 10 のリスト

以前はこれらの監視は完璧だと思っていましたが、MySQL ノード プロセス監視を導入した後、多くの欠点を発見しました。

  • 最初のアプローチの欠点: Zabbix は大きすぎるため、監視は MySQL 内で行われません。大量のデータはあまり準備されておらず、通常は履歴データの確認に使用されます。
  • 2 番目の方法の欠点: 週に 1 回しか実行されないため、多くの状況を検出して報告することができません。
  • 3 番目のアプローチの欠点: ノードにスローログが多数ある場合、top10 は無意味になり、実行する必要がある定期的なタスクのステートメントが提供されることがよくあります。 。あまり参考にならない

では、これらの問題をどのように解決し、調査すればよいのでしょうか?

トラブルシューティングとパフォーマンスのボトルネックの発見に関して、最も簡単に見つけて解決できる問題は、遅い MYSQL クエリとインデックスのないクエリです。
さて、MySQL で実行するのが「快適」ではない SQL ステートメントを探し始めましょう。

方法 1 : 現在、この方法を使用しています。ハハ、この方法の即時性が気に入っています。

Mysql バージョン 5.0 以降では、実行速度が遅い SQL ステートメントの記録をサポートできます。

mysql> show variables like 'long%'; 注: この long_query_time は、クエリが何秒遅い場合に「遅いクエリ」と見なされるかを定義するために使用されます。
+-----------------+-----------+
| 変数名 | 値 |
+-----------------+-----------+
| 長いクエリ時間 | 10.000000 |
+-----------------+-----------+
セット内の 1 行 (0.00 秒)
mysql> set long_query_time=1; 注: これを 1 に設定しました。これは、実行に 1 秒以上かかるクエリは遅いクエリとみなされることを意味します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> 'slow%' のような変数を表示します。
+---------------------+---------------+
| 変数名 | 値 |
+---------------------+---------------+
| 遅い起動時間 | 2 |
| slow_query_log | ON | 注: ログ記録をオンにするかどうか | slow_query_log_file | /tmp/slow.log | 注: 設定する場所+---------------------+---------------+
セット内の 3 行 (0.00 秒)
mysql> set global slow_query_log='ON' 注: ログ記録をオンにします

slow_query_log 変数を ON に設定すると、mysql はすぐにログ記録を開始します。
上記のMYSQLグローバル変数の初期値は/etc/my.cnfで設定できます。
long_query_time=1
slow_query_log_file=/tmp/slow.log

方法 2 : mysqldumpslow コマンド

/path/mysqldumpslow -sc -t 10 /tmp/slow-log
これにより、最も多くのレコードを含む上位 10 個の SQL ステートメントが出力されます。
-sソート方法を示します。 ctl 、およびr 、それぞれレコード数、時間、クエリ時間、および返されたレコード数でソートします。 acatal 、およびar 、対応する逆ソ​​ートを示します。
-t上位 n を意味し、返されるレコードの数を意味します。
-g後には、大文字と小文字を区別しない正規表現マッチングパターンを続けることができます。
例えば
/path/mysqldumpslow -sr -t 10 /tmp/slow-log
最も多くのレコードを返す上位 10 件のクエリを取得します。
/path/mysqldumpslow -st -t 10 -g “left join” /tmp/slow-log
時間順に並べられた左結合を含む最初の 10 個のクエリ ステートメントを取得します。 最後に、ノード監視の利点をまとめます。

  1. 軽量な監視、リアルタイム、実際の状況に応じてカスタマイズおよび変更可能
  2. 実行する必要があるステートメントをフィルタリングするためのフィルターが設定されます。
  3. 未使用のインデックスや不正なクエリをタイムリーに検出します。これらの遅いステートメントの処理には時間がかかりますが、データベースのクラッシュを回避するには価値があります。
  4. データベースへの接続が多すぎる場合、プログラムは現在のデータベースのプロセスリストを自動的に保存します。これは DBA が原因を見つけるための優れたツールです。
  5. mysqlbinlogを分析に使用すると、データベースの状態が異常な期間を明確に把握できます。

MySQLの設定ファイルを設定することを提案する人もいます

tmp_table_sizeを調整すると、他のパラメータが見つかりました
Qcache_queries_in_cacheキャッシュに登録されたクエリの数
Qcache_insertsキャッシュに追加されたクエリの数
Qcache_hitsキャッシュサンプル数
Qcache_lowmem_prunesメモリ不足のためキャッシュから削除されたクエリの数
Qcache_not_cachedされなかったクエリの数(キャッシュできなかったか、QUERY_CACHE_TYPE が原因)
Qcache_free_memoryクエリ キャッシュの合計空きメモリ
Qcache_free_blocksクエリキャッシュ内の空きメモリブロックの数
Qcache_total_blocksキャッシュ内のブロックの総数を照会します
Qcache_free_memory 、よく使用されるクエリの一部をキャッシュできます。よく使用される SQL の場合は、メモリにロードされます。これにより、データベースのアクセス速度が向上します。

これで、MySQL クエリの最適化、クエリが遅くなる原因と解決策に関するこの記事は終了です。MySQL クエリの最適化に関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLクエリ文の実行プロセスを理解するための記事
  • MySQLクエリ文の実行プロセスの詳細な説明
  • Python SQL ステートメントを使用して、MySQL データベースで複数条件のあいまいクエリを実行するアイデアの詳細な説明
  • MySQLクエリ制御ステートメントの詳細なグラフィック説明
  • Mysql クエリの結果セットを JSON データに変換するサンプル コード
  • Visual Studio Codeを使用してMySqlデータベースに接続し、クエリを実行します。
  • MySQL 集計統計データの低速クエリの最適化
  • MySQL マルチテーブルクエリの具体例
  • あるテーブルからバッチデータをクエリし、それを別のテーブルに挿入する MySQL の完全な例
  • MySQLでSQLクエリ文がどのように実行されるかを分析する

<<:  Dockerコンテナ間のホスト間通信 - オーバーレイベースの実装方法

>>:  CSS による要素の中央揃えの原理の分析

推薦する

水平ヒストグラムを作成するための MySQL ソリューション

序文ヒストグラムは、RDBMS によって提供される基本的な統計情報です。最も一般的に使用されるのは、...

Raspberry Pi 3B+ に 64 ビット Ubuntu システムと Docker ツールをインストールする詳細な手順

Raspberry Pi 3B に 64 ビット アプリケーション (64 ビット JDK など) ...

画像ボタン送信とフォーム繰り返し送信の問題に関する議論

多くの場合、フォームを美しくするために、送信ボタンが画像に置き換えられます。ただし、細部に注意を払わ...

サーバー上でjupyterノートブックを実行する問題を解決する

目次サーバーはjupyterノートブックを実行します仮想環境次にファイアウォールをオフにしますJup...

ラベルとボタンを削除し、背景画像の点線/影を追加すると完璧な解決策になります

ユーザーが登録すると、ラベルをクリックして確認コードを変更します。クリックするとラベルに影の部分がで...

フレックスレイアウトでコンテナ内のコンテンツを維持するためのソリューションの詳細な説明

モバイル側では、フレックスレイアウトが非常に便利です。デバイスの幅に応じてコンテナの幅を自動的に調整...

Mysql関数呼び出しの最適化の詳細な説明

目次関数呼び出しの最適化関数呼び出しの最適化MySQL 関数は、内部的に決定論的または非決定論的とし...

CSS 属性を使用してマウス イベントをブロックする方法 (マウス クリックは上位の要素を貫通する可能性があります)

由来: 数日前、テスターから写真を見るという要件が送られてきました。 この要件を見たとき、私は少し混...

静的リソースファイルのアクセスログをフィルタリングするNginxの実装

乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...

JavaScript スクリプトが実行されるタイミングの詳細な説明

JavaScript スクリプトは HTML 内のどこにでも埋め込むことができますが、いつ呼び出され...

IE9 のネイティブ ページ互換性の問題に対する解決策についての簡単な説明

序文最近、クライアントのネイティブページを引き継ぎました。顧客は、ページが IE9 以降のバージョン...

MySQL DEFINER の使用方法の詳細な説明

目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...

Linux でパスワードを入力せずに sudo コマンドを実行する方法

sudo コマンドを使用すると、信頼できるユーザーは別のユーザー (デフォルトでは root ユーザ...

Tomcat を設定して IntelliJ IDEA 2018 で最初の Java Web プロジェクトを実行する方法

1 Tomcatをダウンロードして起動する公式サイト http://tomcat.apache.or...

Vue プロジェクトのパッケージ化と最適化の実装手順

目次Vueプロジェクトのパッケージ化、起動、最適化Vueプロジェクトのパッケージ化プロジェクトホステ...