記事ディレクトリ:
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コマンドで再度確認します。