現在のデータベースには多くの監視方法があり、組み込みデータベース、商用データベース、オープンソースの 3 つのカテゴリに分類され、それぞれに独自の特徴があります。
mysqlデータベースはコミュニティ活動が活発なため、様々な監視手法が存在しますが、いずれの監視手法においても核となるのは監視データであり、網羅的な監視データを取得した上で柔軟に表示する部分となります。
そこで今日は、単一のシステムで最速、最も便利、そして最小の損失を実現できる、mysql 独自の方法を使用した監視データの収集と取得を紹介します。
この記事では、mysql に付属の show コマンドを完全に使用して、接続、バッファキャッシュ、ロック、SQL、ステートメント、データベース スループット、serverconfig の側面から監視データを取得します。
1. 接続数(Connect)
1.1、使用される接続の最大数
show status like 'Max_used_connections';
1.2、現在開いている接続の数
show status like 'Threads_connected';
2. キャッシュ (bufferCache)
2.1、バッファプールから読み取れなかった回数
show status like 'Innodb_buffer_pool_reads';
2.2、バッファプールからの読み取り回数
show status like 'Innodb_buffer_pool_read_requests';
2.3. バッファプール内の総ページ数
show status like 'Innodb_buffer_pool_pages_total';
2.4. バッファプール内の空きページの数
show status like 'Innodb_buffer_pool_pages_free';
2.5、キャッシュヒット率の計算
(1-Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)*100%
2.6. キャッシュプールの使用率は
((Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free)/Innodb_buffer_pool_pages_total)*100%
3.ロック(ロック)
備考: ロック待ち統計のカウント数は累積データであり、取得するたびに前回のデータから減算して現在の統計データを得ることができます。
3.1、ロック待ち数
show status like 'Innodb_row_lock_waits';
3.2. 各ロックの平均待ち時間
show status like 'Innodb_row_lock_time_avg';
3.3. テーブルロックの有無を確認し、データがあればテーブルロックあり、空であればテーブルロックなしを意味します。
show open TABLES where in_use>0
4. SQLが遅い
備考: mysqldumpslow コマンドの実行が失敗すると、スロー ログはフォーマットのためにローカルに同期されます。
4.1. mysql low sql スイッチがオンになっているかどうかを確認する
show variables like 'slow_query_log'; --ON 为开启状态,OFF 为关闭状态
set global slow_query_log=1 -- 可进行开启
4.2. mysql の遅い SQL しきい値を表示する
show variables like 'long_query_time';
set global long_query_time=0.1 -- 根据页面传递阈值参数,修改阈值
4.3. mysql の遅い SQL ディレクトリを表示する
show variables like 'slow_query_log_file';
4.4、遅い SQL ログのフォーマット
注: このステートメントは jdbc を通じて実行できません。コマンド ライン実行に属します。
これは、最長 10 個の SQL ステートメントの実行情報を表示し、10 個を TOP の数として変更できることを意味します。表示される情報は、実行時間、平均実行時間、SQL ステートメントです。
mysqldumpslow -s at -t 10 /export/data/mysql/log/slow.log
5、声明
5.1、インサートの数
show status like 'Com_insert';
5.2、数量の削除
show status like 'Com_delete';
5.3. アップデートの数
show status like 'Com_update';
5.4、数量を選択
show status like 'Com_select';
6. スループット (データベースのスループット)
6.1. 送信スループット
show status like 'Bytes_sent';
6.2. 受信スループット
show status like 'Bytes_received';
6.3. 総スループット
Bytes_sent+Bytes_received
7. データベースパラメータ (serverconfig)
7.1、変数の表示
8. SQL が遅い場合のトラブルシューティング手順
遅い SQL とは、MySQL の遅いクエリ、具体的には実行に long_query_time 値よりも長い時間がかかる SQL を指します。
MySQLにはバイナリログbinlog、リレーログrelaylog、REDOロールバックログredolog、undologなどがあるという話をよく聞きます。スロークエリの場合は、スロークエリログslowlogもあります。これは、応答時間がMySQLのしきい値を超えたステートメントを記録するために使用されます。実際の運用ビジネスに対する SQL の遅さの影響は致命的であるため、テスターにとってパフォーマンス テスト中にデータベース SQL ステートメントの実行を監視し、開発に正確なパフォーマンス最適化の提案を提供することが特に重要です。次に、Mysql データベースによって提供されるスロー クエリ ログを使用して、SQL ステートメントの実行を監視し、消費量の多い SQL ステートメントを見つける方法について説明します。以下では、スロー クエリ ログを使用する手順について詳しく説明します。
8.1. 低速SQLスイッチslow_query_logを必ずオンにしてください
8.2. 遅い SQL ドメイン値の long_query_time の設定
このlong_query_timeは、何秒よりも遅い場合の「遅いクエリ」を定義するために使用されます。単位は秒であることに注意してください。SQLコマンドsetlong_query_time=1を実行して、long_query_timeの値を1に設定します。時間が 1 秒を超えている場合は、次のように遅いクエリを計算します。
8.3. 遅い SQL ログのパスを確認する
8.4. 遅い SQL 分析ツール mysqldumpslow を使用した遅い SQL ログのフォーマットと分析
mysqldumpslow は、インストール後に mysql に付属する低速クエリ分析ツールです。パラメータの説明は、./mysqldumpslow --help で表示できます。
8.4.1、一般的な使用法
- 最も使用されている 10 個の遅いクエリを抽出する
./mysqldumpslow -s c -t 10 /export/data/mysql/log/slow.log
-
クエリ時間が最も遅い 3 つの低速クエリを取り出します。
./mysqldumpslow -s t -t 3 /export/data/mysql/log/slow.log
注: mysqldumpslow を使用した分析結果には、特定の完全な SQL ステートメントは表示されず、SQL の構成構造のみが表示されます。 if: SELECT
FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;
mysqldumpslow コマンドの実行後、表示されます:
カウント: 2 時間=1.5秒 (3秒) ロック=0.00秒 (0秒) 行=1000.0 (2000), vgos_dba[vgos_dba]@[10.130.229.196]SELECT FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N
8.4.2 mysqldumpslowの解析結果の詳細説明
- Count: この種のステートメントの実行回数を示します。上の図では、select ステートメントが 2 回実行されます。
- 時間: このタイプのステートメントの平均実行時間 (合計時間) を示します。
- ロック: ロック時間は 0 秒です。
- 行: 1 回の戻りでは 1000 レコードが返され、2 回の戻りでは合計 2000 レコードが返されます。
このツールにより、どのSQL文が遅いSQLであるかを把握し、インデックスの追加やアプリケーションの実装方法などの最適化のための研究開発にフィードバックすることができます。
8.5.一般的な遅い SQL のトラブルシューティング
8.5.1.サブクエリを使用しない
SELECT FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');
MySQL 5.5 では、内部実行プランナーは次の方法でサブクエリを実行します: 最初に内部テーブル t2 をチェックするのではなく、最初に外部テーブルをチェックし、次に内部テーブルと一致します。外部テーブルのデータが大きい場合、クエリ速度は非常に遅い。
MariaDB10/MySQL5.6 版では、結合関連付け方式を使用して最適化されており、この SQL は自動的に次のように変換されます。
SELECT t1. FROM t1 JOIN t2 ON t1.id = t2.id;
ただし、最適化は SELECT に対してのみ有効であり、UPDATE/DELETE サブクエリに対しては無効であることに注意してください。運用環境では、サブクエリの使用を避けるようにしてください。
8.5.2.関数インデックスを避ける
SELECT FROM t WHERE YEAR(d) >= 2016;
MySQL は Oracle のような関数インデックスをサポートしていないため、d フィールドにインデックスがある場合でも、テーブル全体を直接スキャンします。
を次のように変更する必要があります。
SELECT FROM t WHERE d >= ‘2016-01-01’;
8.5.3. IN を使用して OR を置き換える非効率なクエリ
遅い
SELECT FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
効率的なクエリ
SELECT FROM t WHERE LOC_IN IN (10,20,30);
8.5.4、 LIKE 二重パーセント記号はインデックスを使用できません
SELECT FROM t WHERE name LIKE '%de%';
を次のように変更する必要があります。
SELECT FROM t WHERE name LIKE 'de%';
8.5.5.グループ統計によりソートが無効になる場合がある
SELECT goods_id,count() FROM t GROUP BY goods_id;
デフォルトでは、MySQL はすべての GROUP BY col1、col2... フィールドをソートします。クエリに GROUP BY が含まれており、並べ替えられた結果の消費を避けたい場合は、ORDER BY NULL を指定して並べ替えを無効にすることができます。
を次のように変更する必要があります。
SELECT goods_id,count () FROM t GROUP BY goods_id ORDER BY NULL;
8.5.6.不要なORDER BYソートの禁止
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;
を次のように変更する必要があります。
SELECT count (1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;
9. まとめ
- 何事も外見にあまり注意を払うべきではありませんが、内面に注意を払うと、多くの場合、華やかな外観の下に相応の負担や損失が発生します。
- mysql データベースの監視では、ライブラリが初期化されており、監視データの書き込みが有効になっている場合、SQL を介して、performance_schema ライブラリから対応するテーブル データへのアクセスがサポートされます。
- モニタリングにおいては、手段の多様性ではなく、モニタリングの本質と必要なモニタリング項目の内容を理解し、自身のプロジェクトの特性に合ったモニタリング方法を見つけ出すことが重要です。
- mysql を監視する監視ツールを選択するときは、データベース サーバーの監視ツール自体の使用に影響を与えないよう、監視ツール自体の消費量に注意する必要があります。