#この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューターphp mysql スロー クエリとは、比較的ゆっくり実行される SQL ステートメントをログに記録することを指します。スロー クエリ ログをオンにすると、MySQL は指定された時間を超えてクエリを実行するステートメントを記録できます。パフォーマンスのボトルネックを特定して分析することで、データベース システムのパフォーマンスが適切に最適化されます。
php mysql が遅いとは何ですかクエリ?
MySQL スロー クエリは、実行速度が遅い SQL ステートメントをログに記録します。この機能を使用するには、事前に有効にする必要があります。 1. はじめに スロー クエリ ログをオンにすると、MySQL は指定時間を超えたクエリを記録できるようになり、パフォーマンスのボトルネックを特定して分析することで、データベース システムのパフォーマンスをより適切に最適化できます。 2. パラメータの概要slow_query_log スロー クエリのオープン ステータスslow_query_log_file スロー クエリ ログが保存される場所 (このディレクトリには、MySQL 実行アカウントの書き込み権限が必要です)。通常は MySQL データ ストレージ ディレクトリに設定されます) long_query_time クエリが記録されるまでにかかる秒数。デフォルトは 10 秒です。3. スロー クエリを有効にする( 1) スロークエリ関連パラメータの表示mysql> show variables like 'slow_query%'; +---------------------------+-----------------------------------+ | Variable_name | Value | +---------------------------+-----------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/var/mysql/slow.log | +---------------------------+-----------------------------------+ mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+(2) 設定方法方法1:グローバル変数の設定slow_query_logグローバル変数を「ON」状態に設定
mysql> set global slow_query_log='ON';スロークエリログの設定 保存場所
mysql> set global slow_query_log_file='/usr/local/var/mysql/slow.log ';スロークエリ時間を設定し、1秒を超えた場合にクエリを記録
mysql> set global long_query_time=1;方法2:設定ファイルの設定[mysqld ] の設定ファイル my.cnf を変更します。 以下に
[mysqld] slow_query_log = ON slow_query_log_file = /usr/local/var/mysql/slow.log long_query_time = 1を追加します (3) MySQL サービスを再起動します
service mysqld restart(4) 遅いクエリ ログの分析 遅いクエリ ログをインターセプトします:
# Time: 180918 19:06:21 # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707197 # Query_time: 1.015429 Lock_time: 0.000116 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc; # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707236 # Query_time: 1.021662 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '14433' and app_type = 'YGY' order by binding_time desc;ここで確認できます: Query_time (遅いクエリ ステートメントのクエリ時間) が設定された 1 秒を超えている、Rows_sent (遅いクエリ ステートメントのクエリ時間)クエリの戻りレコード)ここでは 1 つのレコードのみが返されます
Rows_examined (遅いクエリによってスキャンされた行の数) 44438 -> ここから、問題が巨大であることがおそらくわかります 次にこれを入れますSQL ステートメントをデータベースに入力して実行し、EXPLAIN 分析を使用して実行計画を確認します。
EXPLAIN select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc;クエリ結果は次のとおりです。 パラメータの説明: ここで確認できます: rows はクエリされる行数です。40,000 行を超えるクエリが実行されているため、明らかに遅いです。 ここにはいくつかの条件があり、インデックスが使用されていないため、インデックスを追加する唯一の方法は、通常の複数列インデックスをここの選択に追加することです。このテーブルは最初に設計されたものであるため、問題が発生しました。その結果、データが重複し、一意のインデックスを設定できなくなります。
ALTER TABLE app_mobile_device ADD INDEX user_app_type_only ( `user_id` ,`app_type` )インデックスが設定されました。今の SQL の実行計画を見てみましょう。
#チェックされた行数が大幅に減少していることがわかります。
この時点で、スロークエリの使用と最適化は基本的に完了しました。 推奨学習: 「PHP ビデオ チュートリアル
」以上がphp mysqlのスロークエリとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。