MySQLのスロークエリの詳細な説明

MySQLのスロークエリの詳細な説明

MySQL操作情報のクエリ

show status -- すべての MySQL 操作情報を表示します。 show status like "com_insert%"; -- MySQL 挿入の数を取得します。

show status like "com_delete%"; -- mysql 内の削除数を取得します。

show status like "com_select%"; -- mysql クエリの数を取得します。

show status like "uptime"; -- MySQL サーバーの稼働時間を取得します show status like 'connections'; -- MySQL 接続数を取得します

mysql 操作情報をクエリすると、[session|global] ステータスが次のように表示されます。[session|global] を記述しない場合は、デフォルトは session となり、現在のウィンドウの実行のみが取得されます。すべて (mysql の起動から現在まで) を確認したい場合は、global を使用する必要があります。

MySQL の読み取り/書き込み比率を照会することで、対応する構成の最適化を行うことができます。

クエリが遅い

MySQL のパフォーマンスが低下した場合は、スロークエリを有効にして、どの SQL ステートメントが応答の遅延を引き起こしているかを調べて分析します。もちろん、スロークエリをオンにすると CPU の損失とログレコード IO のオーバーヘッドが発生するため、MySQL の実行ステータスを確認するには、スロークエリログを断続的にオンにする必要があります。

スロー クエリでは、long_query_time を超えて実行されるすべての SQL ステートメントを記録できます。これを使用して、スロー SQL ステートメントを見つけて最適化します。

「%slow%」のような変数を表示します。-- スロークエリを有効にするかどうか。
show status like "%slow%"; -- 遅いクエリの SQL ステータスを照会します。
「long_query_time」のような変数を表示します。 -- クエリ時間が遅い

低速クエリの有効化設定

mysql> show variables like 'long_query_time'; -- デフォルトでは、MySQL は 10 秒を遅いクエリと見なします+-----------------+-----------+
| 変数名 | 値 |
+-----------------+-----------+
| 長いクエリ時間 | 10.000000 |
+-----------------+-----------+

mysql> set long_query_time=1; -- 低速クエリ時間を変更します。現在のセッションに対してのみ有効です。
mysql> set global slow_query_log='ON';-- スロークエリを有効にし、グローバルを追加します。そうしないと、エラーが報告されます。

MySQL設定ファイルmy.ini [windows] / my.cnf [Linux]を変更して設定ファイルに追加することもできます。[mysqld]の後に追加する必要があることに注意してください。

slow_query_log = on -- ログ記録を有効にします。
slow_query_log_file = /data/f/mysql_slow_cw.log -- ログを記録するためのログ ファイル。注: ウィンドウには、D:/wamp/bin/mysql/mysql5.5.16/data/show-slow.log などの絶対パスを記述する必要があります。 
long_query_time = 2 -- 最長クエリ時間(秒単位)。
log-queries-not-using-indexes -- インデックスを使用しないクエリがログに記録されることを示します。

低速クエリの使用

例1:

mysql> sleep(3) を選択します。

mysql> '%slow%' のようなステータスを表示します。
+---------------------+-------+
| 変数名 | 値 |
+---------------------+-------+
| 遅い起動スレッド | 0 |
| 遅いクエリ | 1 |
+---------------------+-------+
-- Slow_queries 合計1つの遅いクエリがあります

例2:

ストアド プロシージャを使用して、テスト用の大規模なデータベースを構築します。

データ準備

テーブル部門を作成します(
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 コメント 'Number', 
dname VARCHAR(20) NOT NULL DEFAULT "" コメント 'name', 
loc VARCHAR(13) NOT NULL DEFAULT "" コメント '場所'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 コメント 'Department table';

テーブルempを作成する
(empno MEDIUMINT UNSIGNED NOT NULL デフォルト 0, 
ename VARCHAR(20) NOT NULL DEFAULT "" コメント 'name', 
ジョブ VARCHAR(9) NOT NULL DEFAULT "" コメント 'Work',
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 コメント '上位数',
hiredate DATE NOT NULL コメント '入社日'、
sal DECIMAL(7,2) NOT NULL コメント '給与',
comm DECIMAL(7,2) NOT NULL コメント '配当',
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 コメント '部門番号' 
)ENGINE=MyISAM DEFAULT CHARSET=utf8 コメント '従業員テーブル';

テーブル salgradeを作成します(
グレード MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 コメント 'グレード',
losal DECIMAL(17,2) NOT NULL コメント '最低賃金',
hisal DECIMAL(17,2) NOT NULL コメント '最高給与'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 コメント '給与レベル テーブル';

salgrade に VALUES (1,700,1200) を挿入します。
salgrade に値 (2,1201,1400) を挿入します。
salgrade VALUES (3,1401,2000) に挿入します。
salgrade に VALUES (4,2001,3000) を挿入します。
salgrade に VALUES (5,3001,9999) を挿入します。

区切り文字 $
関数 rand_num() を作成する 
tinyint(6) を返す SQLデータを読み取る 
始める 
 return_num tinyint(6) を宣言します。デフォルトは 0 です。
 return_num = floor(1+rand()*30) を設定します。
 return_num を返します。
終了$

区切り文字 $
関数 rand_string(n INT) を作成する 
varchar(255) を返すSQLデータ読み取り 
始める 
 chars_str varchar(100)をデフォルトとして宣言する
 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
 return_str varchar(255) をデフォルト '' として宣言します。
 i int をデフォルトで 0 と宣言します。
 i < n ながら 
  return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1)); を設定します。
  i = i + 1 と設定します。
 終了しながら;
 return_str を返します。
終了$

区切り文字 $
プロシージャ insert_emp(in start int(10),in max_num int(10)) を作成します。
始める
 i int をデフォルトで 0 と宣言します。 
 #set autocommit =0 自動コミットを 0 に設定し、自動送信をオフにします。
 自動コミットを 0 に設定します。 
 繰り返す
  i = i + 1 と設定します。
  emp値に挿入します((start + i)、rand_string(6)、'SALESMAN'、0001、curdate()、2000、400、rand_num());
  i = max_num になるまで
 繰り返し終了;
 専念;
終了$

insert_emp(1,4000000)を呼び出します。
SELECT * FROM `emp` where ename like '%mQspyv%'; -- 1.163 秒

# 時間: 150530 15:30:58 -- クエリは 2015-5-30 15:30:58 に発生しました
# User@Host: root[root] @ localhost [127.0.0.1] -- クエリ実行者は誰で、どのホストにいますか? # Query_time: 1.134065 Lock_time: 0.000000 Rows_sent: 8 Rows_examined: 4000000 
-- Query_time: クエリにかかる合計時間、Lock_time: クエリ中にテーブルがロックされている時間、Rows_sent: 返された行数、Rows_examined: 400 万行のデータをスキャンした後に得られた結果。
SET timestamp=1432971058; -- スロークエリが発生したときのタイムスタンプ。
SELECT * FROM `emp` where ename like '%mQspyv%';

スロー クエリを有効にすると、毎日数 GB のスロー クエリ ログが発生する可能性があります。この時点では、手動で分析することは明らかに非現実的です。

遅いクエリ分析ツール:

mysqldumpslow

このツールは、スロークエリに付属するスロークエリ分析ツールです。通常、MySQL がインストールされていれば、このツールは使用できます。

使用方法: mysqldumpslow [ OPTS... ] [ LOGS... ] -- その後にパラメータとログ ファイルの絶対アドレスが続きます。

 -s 何を基準に並べ替えるか (al、at、ar、c、l、r、t)、デフォルトは 'at' 
        al: 平均ロック時間 
        ar: 送信された行の平均数
        at: 平均クエリ時間
        c: カウント 
        l: ロック時間
        r: 送信された行数
        t: クエリ時間

 -r ソート順を逆にする(最初ではなく最後が最大)
 -t NUM 上位n個のクエリのみを表示
 -a すべての数値をNに、文字列を'S'に抽象化しない
 -n NUM 名前に少なくとも n 桁の数字が含まれる抽象番号
 -g PATTERN grep: この文字列を含む文のみ考慮する
 -h HOSTNAME *-slow.log ファイル名の db サーバーのホスト名 (ワイルドカードも使用可能)、
        デフォルトは「*」で、すべてに一致します
 -i NAME サーバーインスタンス名(mysql.server 起動スクリプトを使用している場合)
 -l 合計時間からロック時間を減算しない

一般的な使用法

mysqldumpslow -sc -t 10 /var/run/mysqld/mysqld-slow.log # 最も遅いクエリ上位 10 件を取得します。 mysqldumpslow -st -t 3 /var/run/mysqld/mysqld-slow.log # 最も遅いクエリ上位 3 件を取得します。 mysqldumpslow -st -t 10 -g "left join" /database/mysql/slow-log # 時間順に並べられた左結合のクエリ上位 10 件を取得します。 mysqldumpslow -sr -t 10 -g 'left join' /var/run/mysqld/mysqld-slow.log # 時間順に並べられた左結合のクエリ上位 10 件を取得します。 mysqldumpslow -sr -t 10 -g 'left join' /var/run/mysqld/mysqld-slow.log #

注意: mysqldumpslow を使用した分析結果には、完全な SQL ステートメントは表示されず、SQL ステートメントの構造のみが表示されます。

場合: SELECT * FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;
mysqldumpsの表示が遅い

カウント: 1 時間=1.91秒 (1秒) ロック=0.00秒 (0秒) 行=1000.0 (1000)、vgos_dba[vgos_dba]@[10.130.229.196]
SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;

pt-クエリダイジェスト

例示する

pt-query-digest は、MySQL のスロー クエリを分析するためのツールです。SHOWPROCESSLIST または tcpdump によってキャプチャされた binlog、一般ログ、スローログ、または MySQL プロトコル データを分析できます。分析結果はファイルに出力できます。分析プロセスは、まずクエリステートメントの条件をパラメータ化し、次にパラメータ化されたクエリをグループ化してカウントし、各クエリの実行時間、回数、割合などを計算します。分析結果を使用して、問題を特定し、最適化することができます。
pt-query-digest は、ダウンロードして権限を付与するだけで実行できる Perl スクリプトです。

インストール

http://www.percona.com/get/pt-query-digest から取得 
chmod +x ptクエリダイジェスト
# これは Linux スクリプトなので、使用するには絶対パスまたは相対パスを指定する必要があります。または、ツール セット全体をダウンロードしてください wget percona.com/get/percona-toolkit.rpm
rpm -ivh percona-toolkit-2.2.13-1.noarch.rpm

percona.com/get/percona-toolkit.tar.gz を取得します。
tar -zxvf percona-toolkit-2.2.13.tar.gz 
cd percona-toolkit-2.2.13
perl メイクファイル.PL
作成 && インストール

構文と重要なオプション

pt-query-digest [オプション] [ファイル] [DSN]

--create-review-table --review パラメータを使用して分析結果をテーブルに出力する場合、テーブルが存在しない場合は自動的に作成されます。
--create-history-table --history パラメータを使用して分析結果をテーブルに出力する場合、テーブルが存在しない場合は自動的に作成されます。
--filter は、入力されたスロークエリを、指定された文字列に従って照合およびフィルタリングしてから分析します。 --limit は、出力結果の割合または数を制限します。デフォルト値は 20 で、最も遅い 20 個のステートメントが出力されることを意味します。50% の場合、合計応答時間の割合に応じて大きいものから小さいものの順にソートされ、合計が 50% に達すると出力が終了します。
--host mysql サーバアドレス --user mysql ユーザー名 --password mysql ユーザパスワード --history 分析結果をテーブルに保存します。分析結果は比較的詳細です。次回 --history を使用するときに、同じステートメントが存在し、クエリの時間間隔が履歴テーブルと異なる場合は、データテーブルに記録されます。同じ CHECKSUM をクエリすることで、特定の種類のクエリの履歴変更を比較できます。
--review は分析結果をテーブルに保存します。この分析はクエリ条件をパラメータ化しているだけなので、1 つのクエリ タイプにつき 1 つのレコードとなり、比較的単純です。次回 --review を使用するときに、同じステートメント分析が存在する場合、それはデータ テーブルに記録されません。
--output 分析結果の出力タイプ。値は、report(標準分析レポート)、slowlog(MySQL スローログ)、json、json-anon のいずれかです。読みやすさの点から、通常は report が使用されます。
--since 分析を開始する時間。値は文字列です。「yyyy-mm-dd [hh:mm:ss]」の形式で指定された時間ポイント、または単純な時間値(s(秒)、h(時間)、m(分)、d(日))になります。たとえば、12h は、統計が 12 時間前から開始されることを意味します。
--until 期限を --since と組み合わせると、一定期間にわたって遅いクエリを分析できます。

パートI: 全体的な統計結果:

標準分析レポートの説明

全体: クエリは合計でいくつありますか? 上記の例では、クエリは合計で 266 個あります。
時間範囲: クエリ実行の時間範囲。
unique: 一意のクエリの数、つまり、クエリ条件がパラメータ化された後の異なるクエリの合計数。この例では 4 です。
total: 合計 min: 最小 max: 最大 avg: 平均
95%: すべての値を小さいものから大きいものの順に並べると、一般的に 95% の数値が最も参考になります。
中央値:中央値とは、小さい値から大きい値の順に並べたすべての値の真ん中にある数値です。

パート2: クエリグループ統計結果:

この部分では、クエリをパラメータ化してグループ化し、各タイプのクエリの実行を分析します。結果は、合計実行時間によって最大から最小の順に並べ替えられます。
応答: 合計応答時間。
time: この分析におけるこのクエリの合計時間の割合。
呼び出し: 実行回数、つまりこの分析に含まれるこのタイプのクエリ ステートメントの数。
R/Call: 実行あたりの平均応答時間。
アイテム: クエリオブジェクト

パート3: 各クエリの詳細な統計:

上の図、クエリ 1 の詳細な統計結果からわかるように、上部の表には実行回数、最大、最小、平均、95% などの各項目の統計が一覧表示されます。
データベース: データベース名
ユーザー: 各ユーザーの実行回数 (パーセンテージ)
Query_time distribution: クエリ時間の分布。長さは間隔の比率を反映します。この例では、1 秒から 10 秒の間にクエリはなく、すべてのクエリが 10 秒に集中しています。
テーブル: クエリに関係するテーブル
説明: このクエリの例

使用例

(1)スロークエリファイルを直接分析する:

pt-query-digest slow.log > slow_report.log

(2)過去12時間のクエリを分析します。

pt-query-digest --since=12h slow.log > slow_report2.log

(3)指定された時間範囲内のクエリを分析する:

pt-query-digest slow.log --since '2014-05-17 09:30:00' --until '2014-06-17 10:00:00' >> slow_report3.log

(4)選択文のみを含む遅いクエリを分析する

pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log> slow_report4.log

(5)特定のユーザーに対するクエリが遅い

pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log> slow_report5.log

(6)全テーブルスキャンや全結合を伴うすべての低速クエリをクエリする

pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") ||(($event->{Full_join} || "") eq "yes")' slow.log> slow_report6.log

(7)クエリをテストデータベースのquery_reviewテーブルに保存します。存在しない場合は自動的に作成されます。

pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_review --create-review-table slow.log

(8)クエリをquery_historyテーブルに保存する

pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_history --create-review-table slow.log_20140401

(9)MySQLのTCPプロトコルデータをtcpdumpでキャプチャし、分析する

tcpdump -s 65535 -x -nn -q -tttt -i 任意 -c 1000 ポート 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log

(10)バイナリログを分析する

mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
pt-クエリダイジェスト --type=binlog mysql-bin000093.sql > slow_report10.log

(11)一般ログの分析

pt-query-digest --type=genlog localhost.log > slow_report11.log

以上がMySQLスロークエリの詳細な説明です。MySQLスロークエリの詳細については、123WORDPRESS.COMの他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • Mysql sql スロークエリ監視スクリプトコード例
  • MySQL の遅いクエリを見つける方法
  • MySQL スロークエリ関連パラメータの原理の分析
  • MySQL のスロークエリの方法と例
  • MySQL 5.7 のスロークエリログの時間がシステム時間より 8 時間遅れている理由の詳細な説明
  • MySQL の遅いクエリの最適化方法と最適化の原則
  • MySQL スロークエリを通じて MySQL のパフォーマンスを最適化する方法
  • MySQL でスロークエリログ機能を有効にする方法
  • MySQL スロークエリログの設定と使用方法のチュートリアル
  • MySQL でスロークエリログを有効にする方法
  • MySQL の遅いクエリの例

<<:  jQueryはシンプルなカルーセル効果を実装します

>>:  Linux システムで Vim を使用してリモート ファイルを読み書きするコマンドの詳細な説明

推薦する

MySQL 8.0.23 無料インストールバージョンの設定詳細チュートリアル

最初のステップは、MySQL 8.0.23の無料インストールバージョンをダウンロードすることです。 ...

MySQL自動シャットダウン問題への対処の実践記録

最近、あるプロジェクトを手伝ったのですが、MySQL マシンがしばらくすると自動的に停止し続けました...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...

mysql bin-log ログファイルを sql ファイルに変換する方法

mysqlbinlogのバージョンを表示mysqlbinlog -V [--version] bin...

タブバーの切り替え効果を実現するJavaScript

タブバー: 異なるタブをクリックすると異なるコンテンツが表示され、クリックしたタブのスタイルが変更さ...

nginx を使用してブルーグリーン デプロイメントをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してブルーグリーン デプロイメント...

MySQL の null 制約のケースの説明

目次テーブルを作成するときにNOT NULL制約を設定するテーブルを変更するときに非NULL制約を追...

Ubuntuのソースリスト(ソースリスト)を変更する方法詳細説明

導入Ubuntu のデフォルトのソースは国内サーバーではないため、更新されたソフトウェアのダウンロー...

MySQL トランザクション分離レベルの表示と変更の例

トランザクション分離レベルを確認するMySQL では、'%tx_isolation%'...

vue-tableは追加と削除を実装します

この記事では、vue-table の追加と削除の具体的なコードを参考までに紹介します。具体的な内容は...

divの適応高さは残りの高さを自動的に埋めます

シナリオ 1: HTML: <div class="outer"> ...

Docker で Ubuntu に Python3 と Pip をインストールする際の問題

文章1) Ubuntuイメージをダウンロードする docker プル Ubuntu 2) 画像を見る...

JavaScript キャンバスでカラフルな太陽のハロー効果を実現

この記事では、カラフルな太陽のハロー効果を実現するためのJavaScriptキャンバスの具体的なコー...

vue構成ファイルはルーティングとメニューインスタンスコードを自動的に生成します

目次前面に書かれたルータ.jsonルート生成メニュー生成効果要約する前面に書かれたルートを繰り返し記...

MySQL DMLステートメントの使用に関する詳細な説明

序文:前回の記事では、注意深い学生であれば発見できたかもしれない DDL ステートメントの使用法を中...