序文
最近、高性能mysqlのサーバーパフォーマンス分析に関する章を読み、記録を読んだ後、学んだことを整理しました。
1.パフォーマンスの最適化とは
この本は、サービスの通常の操作ではサービスの応答時間が短縮されるという簡単な説明を提示しています(応答時間は後でrtに置き換えられます)。
したがって、サービスの応答時間を短縮したいので、つまり、最適化後のrtは前のrtよりも小さくなっています。ここでの前提は
、前のrtが何であるかを知ってから最適化し、新しいrtを前のrtと比較することです。 。新しいrtが比較的小さい場合、最適化が成功します。
サーバーのパフォーマンスと応答時間を測定または測定する方法はもう1つ重要です。
段階的に見ていきましょう。応答時間を短縮するために、ここで応答時間を測定する必要があります。次に、現在の応答時間を分析して、どのステップがより時間がかかり、なぜそれが非常に遅いのかを解明し、特定のリンクを減らすための適切な薬を処方する必要があります。時間のかかる、そして最適化された結果を実現します。
2.パフォーマンスの最適化を理解する
一般的に言って、mysqlのパフォーマンス最適化は選択を指し、応答時間は実際には
実行時間と待機時間の2つの部分に細分することができます。パフォーマンス分析を実行する場合、問題のどの部分が主な問題であるかを理解する必要があります。それが主に実行時間の90%、実行時間の10%などの待機時間である場合、待機時間が最初にI / O問題である可能性があります。
パフォーマンスの最適化に関するいくつかのルール:
2.1最適化に値するクエリ:
1.応答時間の割合が5%を超えない場合、最適化する価値はありません。どれだけ頑張っても、メリットは5%を超えません
。2。最適化のコストがメリットよりも大きい場合、最適化する価値はありません。最適化には時間がかかります。すでに高速なクエリを改善すると、費やした時間は価値がありません。逆最適化と言うことができ、無駄な作業をするための時間を無駄にします
2.2異常な状況:
一部の低頻度クエリは多くない場合がありますが、時間がかかり、ユーザーエクスペリエンスに直接影響します。このようなクエリも見つけて最適化する必要があります。
2.3不明不明
測定ツールで測定された時間は、実際のアプリケーションの実行時間と正確に一致していない場合があり、差異がある場合があります。たとえば、測定ツールでは9.6秒、実際のプログラム印刷時間は
11秒、1400ミリ秒の差は測定されず、プログラムの一部のサブタスクは測定されなかったため、トラブルシューティングが不正確になり、最適化に影響する可能性があります。進捗。
2.4非表示の詳細
理解を深めるための例を次に示します。クエリは10,000個あり、1〜2個のクエリは非常に遅く、呼び出し頻度はそれほど多くありません。その他のクエリは非常に高速です。平均すると、この1〜2個のクエリの応答時間は
平均すると、異常は見られません。この種のクエリはまだ最適化する必要があります。特定の時間に、呼び出しが多すぎるため、サーバーが直接中断またはハングする場合があります。
3.アプリケーションを分析する
この本では、いくつかの特定のパフォーマンス分析ツールを説明するために、例としてphpを使用しています。言語ごとにSQLパフォーマンス分析ツールが異なるため、ここでは詳しく説明しません。
4. mysqlクエリの構造
4.1サーバー負荷クエリ
4.1.1サーバーの問題は、mysqlのスロークエリログで確認できます。pt-query-digest
4.1.2 を使用してtcpネットワークパケットをキャプチャし、mysqlクライアントとサーバー間の通信プロトコルを分析してクエリログを分析し、正確な分析を行うことをお勧めします。
4.2単一のパフォーマンスクエリ
1.
デフォルトでshow profileの使用は無効になっていますが、セッションレベルの変数を変更することで動的にオンにすることができます。
mysql> SET profiling = 1;
開いた後、すべての文、消費された時間、および関連するパラメータが測定され、保存されます。
公式文書アドレス
2. show statusの公式ドキュメントアドレスを使用する
show statusは、セッションのさまざまな情報を表示でき、グローバル変数も表示できます。グローバル変数を照会する場合は、show globals statusを使用します。
基本的な使用法は次のとおりです。
show status like '变量名';
一般的に使用される方法は次のとおりです。
--查看MySQL本次启动后的运行时间(单位:秒)
show status like 'uptime';
--查看select语句的执行数
show [global] status like 'com_select';
--查看insert语句的执行数
show [global] status like 'com_insert';
--查看update语句的执行数
show [global] status like 'com_update';
--查看delete语句的执行数
show [global] status like 'com_delete';
--查看试图连接到MySQL(不管是否连接成功)的连接数
show status like 'connections';
--查看线程缓存内的线程的数量。
show status like 'threads_cached';
--查看当前打开的连接的数量。
show status like 'threads_connected';
--查看当前打开的连接的数量。
show status like 'threads_connected';
--查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。
show status like 'threads_created';
--查看激活的(非睡眠状态)线程数。
show status like 'threads_running';
--查看立即获得的表的锁的次数。
show status like 'table_locks_immediate';
--查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
show status like 'table_locks_waited';
--查看创建时间超过slow_launch_time秒的线程数。
show status like 'slow_launch_threads';
--查看查询时间超过long_query_time秒的查询的个数。
show status like 'slow_queries';
3. スロークエリログの
公式ドキュメントアドレスを使用し
ます。デフォルトでは、スロークエリログはオフになっています。変数slow_query_logはスロークエリログであり、変数を設定することでオンにできます。
查询慢查询日志:
mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /xxx/mysql/DB-Server-slow.log |
+---------------------+-----------------------------------------------+
设置慢查询日志
mysql> set global slow_query_log=1;
4. PERFORMANCE_SCHEMAの
公式ドキュメントアドレスを使用
ここでは、mysql5.6を例にとると、PERFORMANCE_SCHEMAは、mysqlサーバーのパフォーマンスを記録するテーブルです。デフォルトはオフです。有効にするには設定を有効にする必要があります。
如下开启:
[mysqld]
performance_schema=ON
查看下是否开启:
mysql>show variables like 'performance_schema';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| performance_schema | ON |
+--------------------+-------+
5.その他の診断ツール
5.1 USER_STATISTICS
Percona Server和MariaDB是支持的,官方的mysql我试了下好像没有找到这个。据说官方分支的mysql是使用的performance
schema表。
这个工具可以查看到什么表,什么索引使用最频繁或者最频繁等信息。
命令:
```
mysql> show tables from information_schema like "%_STATISTICS";
```
5.2ステイス
staceは、mysql自体ではなく、linuxコマンドであるシステムコールを表示および出力できます。
使用方式: strace -p pid or strace command
一般的な文章:
1.通用示例:
#strace -o output.txt -T -tt -e trace=all -p 28979
跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面
2.统计httpd进程的耗时时间:
#strace -c -p $(pgrep -n httpd)
按crtl+c,将显示从开始到结束的时间调用
3.跟踪最占cpu的httpd的一个进程,并将信息输出到文件
#strace -t -f -o httpd-strace -p $(top -b -n1 | grep "httpd" | head -1 | awk '{print $1}')
総括する:
1.パフォーマンス測定の最も直接的で効果的な方法は、応答時間に基づいてい
ます。2.アプリケーションからパフォーマンスの測定を開始するのが最善です
。3.応答時間は、実行時間と待機時間に分けられます
。4.最初に、実行時間または待機時間が長すぎるかどうかを理解する必要があります影響を受けるパフォーマンス
5.最適化を考慮する必要がない応答時間の5%未満、最適化コストが利益よりも高い場合、ナイフエッジに労力を費やす必要があります
。最適化する価値はありません6.どの測定ツールにも、測定が行われないタスクや場所がある場合があります。ただし、詳細が隠されていることが重要になる場合があり、複数の方法で分析を組み合わせる方がより正確になります