MySQLの高度な記事-MySQLの遅いクエリログについて話します

記事ディレクトリ:

1.データベースサーバーの最適化手順

2.システムパフォーマンスパラメータを表示する

3.遅いSQL実行を見つけます:遅いクエリログ

4. SQL実行コストの表示:SHOW PROFILE


1.データベースサーバーの最適化手順

データベースのチューニングの問題が発生した場合、どのように考える必要がありますか?ここで、思考プロセスは次の図にまとめられています。
プロセス全体は、 観察( ステータスの表示 アクション( アクション の2つの部分に分かれています。文字 Sの部分は 観察を表し(対応する分析ツールが 使用され)、文字 Aの部分 はアクション(分析が実行できるアクションに対応)です。


2.システムパフォーマンスパラメータを表示する

MySQL では SHOW STATUS ステートメントを使用して、一部の MySQL データベース サーバーのパフォーマンスパラメータ 実行頻度をクエリできます
SHOWSTATUSステートメントの 構文は次のとおりです。
SHOW [GLOBAL|SESSION] STATUS LIKE '参数';
一般的に使用されるパフォーマンスパラメータは次のとおりです。
•接続: MySQLサーバー に接続する回数。
•稼働時間 MySQL サーバーの オンライン時間。
•Slow_queries :遅いクエリの数。
•Innodb_rows_read Select クエリによって返される行数
Innodb_rows_inserted INSERT 操作によって挿入された行の数
•Innodb_rows_updated UPDATE 操作によって更新された 行の数
•Innodb_rows_deleted DELETE 操作によって削除された行の数
•Com_select :クエリ操作の数。
Com_insert :挿入操作の数。 バッチ挿入のINSERT操作の 場合 、1回だけ累積されます。
•Com_update :更新操作 の。 •Com_delete :削除操作の数。

3.遅いSQL実行を見つけます:遅いクエリログ

slow_query_logを有効にする

次に、低速クエリログが有効になっているかどうか、および低速クエリログファイルの場所を確認しましょう。

この時点で低速クエリ分析がオンになっており、ファイルが /var/lib/mysql/atguigu02-slow.log ファイルに保存 され ていることがわかります

long_query_time しきい値を 変更します。 次に、遅いクエリの時間しきい値設定を見てみましょう。次のコマンドを使用します。
ここで、たとえば時間を短縮したい場合は、 0.5 秒に設定します

遅いクエリの数を確認する

以下に、簡単なケースのデモンストレーションを行います。最初に、いくつかのテーブル作成ステートメント、ストアドプロシージャ、およびストアド関数があります。(400万のデータがテーブルに追加されました。少し長くなります...)

CREATE TABLE `student` ( 
		`id` INT(11) NOT NULL AUTO_INCREMENT, 
		`stuno` INT NOT NULL , 
		`name` VARCHAR(20) DEFAULT NULL, 
		`age` INT(3) DEFAULT NULL, 
		`classId` INT(11) DEFAULT NULL, 
		PRIMARY KEY (`id`) 
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

DELIMITER //
CREATE FUNCTION rand_string(n INT) 
	RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN 
	DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
	DECLARE return_str VARCHAR(255) DEFAULT '';
	DECLARE i INT DEFAULT 0;
	WHILE i < n DO 
       SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
       SET i = i + 1;
    END WHILE;
    RETURN return_str;
END //
DELIMITER ;

DELIMITER //
CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11)
BEGIN   
    DECLARE i INT DEFAULT 0;  
    SET i = FLOOR(from_num +RAND()*(to_num - from_num+1))   ;
    RETURN i;  
END //
DELIMITER ;

DELIMITER // 
CREATE PROCEDURE insert_stu1( START INT , max_num INT ) 
BEGIN 
		DECLARE i INT DEFAULT 0; 
		SET autocommit = 0; #设置手动提交事务 
		REPEAT #循环 
				SET i = i + 1; #赋值 
				INSERT INTO student (stuno, NAME ,age ,classId ) 
				VALUES ((START+i),rand_string(6),rand_num(10,100),rand_num(10,1000)); 
				UNTIL i = max_num 
		END REPEAT; 
COMMIT; #提交事务 
END // 
DELIMITER ;

#调用刚刚写好的函数, 4000000条记录,从100001号开始 
CALL insert_stu1(100001,4000000);

SELECT COUNT(*) FROM student;

テーブルとデータの準備ができたら、テストしてみましょう。

これら2つのSQLの実行時間は、カスタムのlong_query_timeしきい値を超えているため、遅いクエリの数を確認できます。

遅いクエリログ分析ツール:mysqldumpslow

実稼働環境で、ログを手動で分析し、 SQL を見つけて分析する場合 、それは明らかに手動の作業です 。MySQL はログ分析ツール mysqldumpslowを提供します
mysqldumpslowの ヘルプ情報を表示する
mysqldumpslow --help
mysqldumpslow コマンドの特定のパラメーターは次のとおりです。
-a:数値を Nに、文字列をS に抽象化しないでください
-s: 並べ替える方法を示します。
c: 訪問数
l: ロック時間
r: レコードを返す
t: クエリ時間
al: 平均ロック時間
ar: 返されたレコードの平均数
at: 平均クエリ時間(デフォルト)
ac: クエリの平均数
-t:つまり、返されるデータの数。
-g: 大文字と小文字を区別しない、通常の一致パターンが続きます。
今すぐケースを分析します:(ここでは、遅いクエリログに、0.5秒以上2回実行したSQLが記録されていることがわかります)
#得到返回记录集最多的10个SQL 
mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log 

#得到访问次数最多的10个SQL 
mysqldumpslow -s c -t 10 /var/lib/mysql/localhost-slow.log 

#得到按照时间排序的前10条里面含有左连接的查询语句 
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow.log 

#另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况 
mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log | more

調整しない場合は、遅いクエリログを開かないことをお勧めします。これは、オンにした後の特定のパフォーマンスにも影響を与えるためです。

それでは、遅いクエリログをオフにすることについて話しましょう。

方法1:slow_query_logアイテムを完全に閉じるか、コメントアウトまたは削除します。操作後にmysqlサービスを再起動することを忘れないでください

[mysqld] 
slow_query_log=OFF 

[mysqld] 
#slow_query_log =OFF

方法2:一時的な閉鎖。ここでは、最初にslow_query_logパラメーターを変更します。次に、mysqlサービスを再起動すると、long_query_timeパラメーターが最初の10秒にリセットされます。

遅いクエリログを削除する


4. SQL実行コストの表示: SHOW PROFILE

以下では、2つのSQLを実行します。

次に、showprofilesコマンドで再度確認します。

 

おすすめ

転載: blog.csdn.net/weixin_43823808/article/details/124128861