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

推薦する

Centos7でのパーティションのフォーマットとマウントの実装

Linux では、ハードディスクの追加やパーティションの再マウントといった状況に頻繁に遭遇します。こ...

WindowsはVMwareを使用してLinux仮想マシンを作成し、CentOS7.2オペレーティングシステムをインストールします。

目次1. ウィザードに従って仮想マシンを作成します2. オペレーティングシステムをインストールします...

Centos7 で crontab + シェル スクリプトによる定期的な自動ファイル削除の問題を解決する

問題の説明:最近、rsyncで毎回同期するデータ量が多いが、データベースのbakファイルを保持する必...

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...

Vue+element はローカル検索機能付きのドロップダウン メニューを実装します

必要:バックエンドは配列オブジェクトを返し、それがフロントエンドで配列に結合されます。配列は名前に従...

Vue のグローバル ウォーターマーク実装例

目次1. 透かしのJsファイルを作成する2. 導入操作2.1 App.vueや他のページでの参照2....

Zabbix はどのようにして ssh 経由でネットワーク デバイス データを監視および取得するのでしょうか?

シナリオシミュレーション:ある会社の運用保守担当者は、以前購入した一連のネットワーク機器の光ポートの...

ノードをMySQLデータベースに接続する際に発生する問題と解決策

今日、MySQL の新しいバージョン (8.0.21) をインストールしましたが、ノード フレームワ...

JavaScript モバイル H5 画像生成ソリューションの説明

現在、WeChatパブリックアカウントの運用活動が多く、写真を生成する必要があります。生成された写真...

Linuxはバイナリモードを使用してmysqlをインストールします

この記事では、LinuxにバイナリモードでMySQLをインストールする具体的な手順を参考までに紹介し...

Vue カプセル化に基づくプルダウン更新およびプルアップ読み込みコンポーネント

VueとネイティブJavaScriptカプセル化に基づいて、プルダウンリフレッシュとプルアップロード...

標準SQL更新ステートメントの3つの用途についての簡単な理解

1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...

insert と select を組み合わせて、「データベース内のフィールドの最大値 + 1 を挿入する」メソッドを実装する

この記事はmysqlデータベースです質問 1 表 1 のデータを表 2 にインポートします。表 1 ...

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...

protobuf の簡単な紹介と Ubuntu 16.04 環境でのインストールチュートリアル

protobufの簡単な紹介Protobuf は、Google のオープンソースのシリアル化プロトコ...