現在のデータベースを監視する方法は数多くあり、組み込みデータベース、商用データベース、オープン ソースの 3 つのカテゴリに分類されます。それぞれに独自の特徴があります。
mysql データベースについては、コミュニティの活動やモニタリング手法は多岐にわたりますが、どのモニタリング手法であっても核となるのはモニタリングデータであり、網羅的なモニタリングデータを取得した上で柔軟に表示できる部分となります。
1.1. 使用される接続の最大数
show status like 'Max_used_connections';
1.2. 現在開いている接続の数
show status like 'Threads_connected';
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.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
注: mysqldumpslow コマンドの実行に失敗すると、遅いログが同期されますフォーマットのためにローカルにコピーします。
4.1. mysql low sql スイッチがオンになっているかどうかを確認します
show variables like 'slow_query_log'; --ON 为开启状态,OFF 为关闭状态 set global slow_query_log=1 -- 可进行开启
4.2. mysql low sql のしきい値を確認します
show variables like 'long_query_time'; set global long_query_time=0.1 -- 根据页面传递阈值参数,修改阈值
4.3. mysql low 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.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.1、送信スループット
show status like 'Bytes_sent';
6.2 、受信スループット
show status like 'Bytes_received';
6.3、合計スループット
Bytes_sent+Bytes_received
7.1、変数の表示
#8. 遅い SQL のトラブルシューティング手順遅い SQL は MySQL の遅いクエリを指し、具体的には実行時間が long_query_time 値を超える SQL を指します。MySQL にはバイナリ ログ binlog、リレー ログ Relaylog、REDO ロールバック ログ Redolog、undolog などがあるという話をよく聞きます。スロー クエリの場合は、スロー クエリ ログ、slowlog もあります。これは、応答時間が MySQL のしきい値を超えたステートメントを記録するために使用されます。 SQL が遅いと、実際の運用ビジネスに致命的な影響を与えるため、テスト担当者にとって、パフォーマンス テスト プロセス中にデータベース SQL ステートメントの実行を監視し、開発に正確なパフォーマンス最適化の提案を提供することが特に重要です。次に、Mysql データベースが提供するスロー クエリ ログを使用して SQL ステートメントの実行を監視し、消費量の多い SQL ステートメントを見つける方法について説明します。以下は、スロー クエリ ログを使用する手順の詳細な説明です:
8.3. 遅い SQL ログ パスを確認します
##8.4. 形式と低速 SQL 分析ツールを使用して低速 SQL ログを分析する mysqldumpslowmysqldumpslow 低速クエリ分析ツールは 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 コマンドは実行および表示:Count: 2 Time=1.5s (3s) Lock=0.00s (0s) Rows=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 の解析結果の詳細説明
Rows:单次返回的结果数是 1000 条记录,2 次总共返回 2000 条记录。
通过这个工具就可以查询出来哪些 sql 语句是慢 SQL,从而反馈研发进行优化,比如加索引,该应用的实现方式等。
8.5、常见慢 SQL 排查
8.5.1、不使用子查询
SELECT FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');
子查询在 MySQL5.5 版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表 t2,当外表的数据很大时,查询速度会非常慢。
在 MariaDB10/MySQL5.6 版本里,采用 join 关联方式对其进行了优化,这条 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;
以上がMySQLデータベースの監視方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。