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 による要素の中央揃えの原理の分析

推薦する

C# は MySQL コマンドラインのバックアップとリカバリを実装します

MySQL データベースをバックアップするためのツールは多数あります。過去 2 日間で、C# を使用...

ミニプログラムは左スライドのドロワーメニューをネイティブに実装します

目次WXS レスポンス イベントプランAページ構造とスタイルWXS イベントコールバック関数WXS ...

Mysql5.7.18 のインストールとマスタースレーブレプリケーションの詳細なグラフィック説明

CentOS6.7にmysql5.7.18をインストールする 1. /usr/localディレクトリ...

Docker ディスク領域クリーニングのソリューション

少し前に、docker ディスク容量が小さすぎてデータを書き込めないという問題が発生しました。理由は...

MySQL で 2 つのセットの交差/差/和を取得する方法

MySQL の一般的なシナリオ: 2 つのデータ セットの交差と差を取得するステップ1. 2つのコレ...

jQueryのチェーンプログラミングスタイルの詳細な例

チェーンプログラミングの実装原理jQuery を使用すると、開発者は常にドット構文を使用して独自のメ...

WindowsにJDK8をインストールする方法

1. ダウンロード: http://www.oracle.com/technetwork/java/...

Linux コマンドを素早く習得する 4 つの方法

Linux マスターになりたいなら、いくつかの Linux コマンドを習得することが不可欠です。 L...

RHEL7.5 mysql 8.0.11 インストールチュートリアル

この記事はRHEL7.5でのMySQL 8.0.11のインストールチュートリアルを記録しています。具...

Linux システム MySQL8.0.19 クイックインストールと構成チュートリアル図

目次1. 環境の紹介2. MySQL-8.0.19をインストールする3. MySQLを設定する1. ...

サーバーの購入と初期構築方法

しばらくサーバーいじってなかったけど、やることがなくなったのでモバイルワークスに行って海外サーバーを...

mysql5.7 の新しい json フィールド タイプの使用例の分析

この記事では、MySQL 5.7 で追加された json フィールド タイプの使用方法を例を使って説...

HTML テーブルタグチュートリアル (45): テーブル本体タグ

<tbody> タグは、テーブル本体のスタイルを定義するために使用されます。基本構文 &...

初心者向け入門講座⑧:記事サイトを簡単に作る

前回の投稿では、Web ページの作成方法について説明しました。Web サイトは多くの Web ページ...

Centos7.4 システムに yum ソースから mysql 5.6 をインストールする

システム環境: centos7.4 1. データベースがインストールされているかどうかを確認します。...