mysql性能——2慢查询

一、mysql数据库优化

1)最大连接数查询

mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
1 row in set (0.00 sec)

2)最大连接数修改

方法1)可以在/etc/my.cnf里面设置数据库的最大连接数
[mysqld]
max_connections = 10000

方法2)mysql>set global max_connections = 5000;
最大可设置16384,超过没用

 二、简单上手版包含全流程

从开启慢sql记录》输出log》分析。直接分析慢sql,不用看其他步骤。

 

进入mysql命令下:

// 查询是否开启慢查询日志 ON OR OFF
1)show variables like "slow_query_log";

// 开启慢查询
2set global slow_query_log=on;

//超过3秒钟查询记录到慢查询日志中,注意修改之后需要重新打开一个会话再查询修改结果
3set global long_query_time = 3;

//查看当前慢查询日志输出的格式:---可以是FILE(存储在数数据库的数据文件中的hostname.log),也可以是TABLE(存储在数据库中的mysql.general_log)
4)show variables like "%log_output%";

进入shell命令下:
//安装perl是mysqldumpslow的一个依赖
5)yum install perl
//运行mysqldumpslow 查看结果 后面不需要加冒号 ”;“ 否则报错
mysqldumpslow –s c –t 10 /usr/local/mysql/data/sql-2-slow.log

 

三、开启慢查询

简介:MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。

  • 1)通用查询日志:记录建立的客户端连接和执行的语句。
  • 2)慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询

 

1)查询所有相关的变量(可略过到第2步)

条件可以是"%quer%"  或  "%log%" 可以查看相关命令。

mysql> show variables like "%quer%";
+----------------------------------------+--------------------------------------+
| Variable_name                          | Value                                |
+----------------------------------------+--------------------------------------+
| binlog_rows_query_log_events           | OFF                                  |
| ft_query_expansion_limit               | 20                                   |
| have_query_cache                       | YES                                  |
| log_queries_not_using_indexes          | OFF                                  |
| log_throttle_queries_not_using_indexes | 0                                    |
| long_query_time                        | 10.000000                            |
| query_alloc_block_size                 | 8192                                 |
| query_cache_limit                      | 1048576                              |
| query_cache_min_res_unit               | 4096                                 |
| query_cache_size                       | 1048576                              |
| query_cache_type                       | OFF                                  |
| query_cache_wlock_invalidate           | OFF                                  |
| query_prealloc_size                    | 8192                                 |
| slow_query_log                         | OFF                                  |
| slow_query_log_file                    | /usr/local/mysql/data/sql-1-slow.log |
+----------------------------------------+--------------------------------------+
15 rows in set (0.01 sec)

 2)开启、查询通用日志

mysql> show variables like "%general%";
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | OFF                             |
| general_log_file | /usr/local/mysql/data/sql-1.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)

mysql> set global general_log = on;
Query OK, 0 rows affected (0.03 sec)

mysql> show variables like "%general%";
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | ON                              |
| general_log_file | /usr/local/mysql/data/sql-1.log |
+------------------+---------------------------------+
2 rows in set (0.01 sec)

 

3)通过命令开启慢查询日志(重启服务失效)

// 查询是否开启慢查询日志 ON OR OFF
show variables like "slow_query_log";
// 开启慢查询
set global slow_query_log=on;
// 指定慢查询日志的存储位置 目录要具有写权限
set global slow_query_log_file = '/home/mysql/sql_log/mysql-slow.log';
// 把没有使用索引的sql记录到慢查询日志中 如果table的数据量小,不建议开启该条设置,因为会记录所有没有用到索引的查询,会给日志填充很多垃圾信息(注意:如果只是将log_queries_not_using_indexes设置为ON,而将slow_query_log设置为OFF,此时该设置也不会生效,即该设置生效的前提是slow_query_log的值设置为ON),一般在性能调优的时候会暂时开启。
set global log_queries_not_using_indexes = on;
// 超过1秒钟查询记录到慢查询日志中,注意修改之后不会变,需要重新打开一个会话查询,再查询就改变了。实际已经改变了。
set global long_query_time = 3;

 

4) 通过my.cof开启慢查询日志(原理和用命令一样),不过配置完成需要重启MySQL(永久有效)

注:MySQL配置文件在Windows下叫my.ini;在Linux下叫my.cnf,文件位于/etc/my.cnf。

方式一:未实验,暂不确定,一般做性能临时生效即可。
目录要具有写权限 log
-slow-queries = '/home/mysql/sql_log/mysql-slow.log' // 在windows的情况下需要绝对路径 log-slow-queries = 'C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-slow.log' long_query_time = 1 log-queries-not-using-indexes = on

 方式二:未实验,暂不确定

 

//这里的内容都没试验,在my.cnf增加或修改下面二行。

 slow_query_log =1

 slow_query_log_file=/tmp/mysql_slow.log

 5)修改输出日志类型

//查看当前慢查询日志输出的格式:---可以是FILE(存储在数数据库的数据文件中的hostname.log),也可以是TABLE(存储在数据库中的mysql.general_log)
show variables like "%log_output%";
//设置通用日志输出为表方式: 这样会输出到mysql库下的
set global log_output="TABLE";
//设置通用日志输出为文件方式: 推荐为FILE文件;
set global log_output="FILE";
//设置通用日志输出为表和文件方式:
set global log_output="FILE,TABLE";
//(注意:上述命令只对当前生效,当MySQL重启失效,如果要永久生效,需要配置my.cnf)

6) 如果输出日志类型为Table,则会输出到mysql库下的slow_log表下。

mysql> show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema            |
| mysql                         |
| mysql_innodb_cluster_metadata |
| performance_schema            |
| rdc_manager                   |
| sys                           |
+-------------------------------+
6 rows in set (0.00 sec)

mysql> use mysql;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
31 rows in set (0.00 sec)

 

 

四、慢查询日志内容简介

慢查询日志所包含的内容
// 执行SQL的主机信息:ROOT用户在本地所执行的查询
# User@Host: root['root'] @ localhost []
// SQL的执行信息 查询时间、锁定时间、发送行数、扫描行数
# Query_time:0.000024 Lock_time:0.0000000 Rows_sent:0 Rows_examined:0
// SQL执行时间 时间戳
# SET timestamp = 1402389328;
// SQL的内容
# select CONCAT('storage engine:',@@storage_engine) as INFO;

五、慢查询日志分析工具

官方文档:https://dev.mysql.com/doc/refman/5.7/en/mysqldumpslow.html

    工具1:mysqldumpslow(mysl官方工具) 一般集成在MySQL安装包中/bin
   工具2:pt
-query-digest工具

 

帮助显示的方法
[root@sql-2 bin]# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default al: average lock time 平均锁时间 ar: average rows sent 平均行发送 at: average query time 平均查询时间 c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) 反转排序顺序(最大的替换第一个) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time

 

-s, 是表示按照何种方式排序,
  c: 访问计数
  l: 锁定时间
  r: 返回记录
  t: 查询时间
  al:平均锁定时间
  ar:平均返回记录数
  at:平均查询时间
-t, 是top n的意思,即为返回前面多少条的数据;
-g, 后边可以写一个正则匹配模式,大小写不敏感的;

比如

得到返回记录集最多的10个SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysq_slow.log

得到访问次数最多的10个SQL

mysqldumpslow -s c -t 10 /database/mysql/mysq_slow.log

得到按照时间排序的前10条里面含有左连接的查询语句。

mysqldumpslow -s t -t 10 -g “left join” /mysql/mysq_slow.log

另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysq-slow.log | more

  

关于慢查询日志的表中的数据个文本中的数据格式分析:

Count: 1  Time=4.64s (4s)  Lock=0.58s (0s)  Rows=0.0 (0), root[root]@rdc-manager2
  DELETE FROM `sessions` WHERE `expires` < N

Count: 6  Time=3.83s (23s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@rdc-manager2
  UPDATE `authorization` SET `user_id` = 'S', `refresh_token` = 'S', `expiry_date` = 'S', `device_id` = 'S'
  WHERE user_id = 'S'
  AND device_id = 'S'
------------------------------------------------------------------------------------------

上述中的参数含义如下:

Count:6     语句出现了6次;

Time=3.83s (23s)  执行最长时间为3.83s,累计总耗费时间23s;

Lock=0.0s(0)           等待锁最长时间为0s,累计等待锁耗费时间为0s;

Rows=2194.9(9097604) 发送给客户端最多的行数为2194.9,累计发送给客户端的函数为90976404

----------------------------------
Count: 15 Time=3.60s (53s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@rdc-manager2 INSERT INTO `sessions` (`session_id`, `expires`, `data`) VALUES ('S', N, 'S') ON DUPLICATE KEY UPDATE `expires` = VALUES(`expires`), `data` = VALUES(`data`) Count: 7 Time=3.48s (24s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@rdc-manager2 UPDATE `user` SET last_login_time = 'S'WHERE id = 'S' Count: 6 Time=3.41s (20s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@rdc-manager2 INSERT INTO `log` SET `company_id` = 'S', `operator_id` = 'S', `category` = N, `type` = N, `log` = 'S', `create_date` = 'S' Count: 5 Time=3.02s (15s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@rdc-manager2 UPDATE `device` SET `user_id` = 'S', `company_id` = 'S', `model` = 'S', `platform` = N, `operating_system` = 'S', `operating_system_architecture` = N, `client_version` = 'S', `is_disabled` = N, `is_deleted` = N, `is_activated` = N, `last_login_time` = 'S' WHERE id = 'S' AND user_id = 'S' Count: 5 Time=2.45s (12s) Lock=0.00s (0s) Rows=1.0 (5), root[root]@rdc-manager2 SELECT * FROM device WHERE id = 'S' AND user_id in ( SELECT id FROM user WHERE (is_deleted = N AND (login_name = 'S' OR email = 'S' OR mobile = 'S')) AND company_id in (SELECT id FROM company WHERE domain_name = 'S') ) Count: 8 Time=2.40s (19s) Lock=0.00s (0s) Rows=1.0 (8), root[root]@rdc-manager2 SELECT * FROM `user` WHERE (is_deleted = N AND (login_name = 'S' OR email = 'S' OR mobile = 'S')) AND company_id in (SELECT id FROM company WHERE domain_name = 'S') Count: 1 Time=2.03s (2s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost select sleep(N)

 

慢查询的日志记录myql.slow_log表中,格式如下:

 

慢查询的日志记录到hostname.log文件中,格式如下:

 

在MySQL中有一个变量专门记录当前慢查询语句的个数:

输入命令:show global status like ‘%slow%’;

mysql> show global status like '%slow%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Slow_launch_threads | 0     |
| Slow_queries        | 54    |
+---------------------+-------+
2 rows in set (0.00 sec)

 

 显示当前数据库中与版本号  show variables like "%version%";

mysql> show variables like "%version%";
+--------------------------------------------------+------------------------------+
| Variable_name                                    | Value                        |
+--------------------------------------------------+------------------------------+
| group_replication_allow_local_lower_version_join | OFF                          |
| innodb_version                                   | 5.7.19                       |
| protocol_version                                 | 10                           |
| slave_type_conversions                           |                              |
| tls_version                                      | TLSv1,TLSv1.1                |
| version                                          | 5.7.19-log                   |
| version_comment                                  | MySQL Community Server (GPL) |
| version_compile_machine                          | x86_64                       |
| version_compile_os                               | linux-glibc2.12              |
+--------------------------------------------------+------------------------------+
9 rows in set (0.00 sec)

 

 

posted @ 2018-05-31 15:32  白灰  阅读(389)  评论(0)    收藏  举报