ホームページ >バックエンド開発 >PHPの問題 >php mysqlのスロークエリとは何ですか?

php mysqlのスロークエリとは何ですか?

藏色散人
藏色散人オリジナル
2021-11-10 09:49:022407ブラウズ

php mysql スロー クエリとは、比較的ゆっくり実行される SQL ステートメントをログに記録することを指します。スロー クエリ ログをオンにすると、MySQL は指定された時間を超えてクエリを実行するステートメントを記録できます。パフォーマンスのボトルネックを特定して分析することで、データベース システムのパフォーマンスが適切に最適化されます。

php mysqlのスロークエリとは何ですか?

#この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

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;

クエリ結果は次のとおりです。

php mysqlのスロークエリとは何ですか?

パラメータの説明:

php mysqlのスロークエリとは何ですか?

ここで確認できます: rows はクエリされる行数です。40,000 行を超えるクエリが実行されているため、明らかに遅いです。

ここにはいくつかの条件があり、インデックスが使用されていないため、インデックスを追加する唯一の方法は、通常の複数列インデックスをここの選択に追加することです。このテーブルは最初に設計されたものであるため、問題が発生しました。その結果、データが重複し、一意のインデックスを設定できなくなります。

ALTER  TABLE  app_mobile_device  ADD  INDEX user_app_type_only (  `user_id` ,`app_type` )

インデックスが設定されました。今の SQL の実行計画を見てみましょう。

#チェックされた行数が大幅に減少していることがわかります。 php mysqlのスロークエリとは何ですか?

この時点で、スロークエリの使用と最適化は基本的に完了しました。

推奨学習: 「

PHP ビデオ チュートリアル

以上がphp mysqlのスロークエリとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。