0
点赞
收藏
分享

微信扫一扫

mysql性能——2慢查询

一、mysql数据库优化

1)最大连接数查询

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

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";

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

//超过3秒钟查询记录到慢查询日志中,注意修改之后需要重新打开一个会话再查询修改结果
3)set 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

 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;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

 

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;> 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

 

 

四、慢查询日志内容简介

慢查询日志所包含的内容
// 执行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

五、慢查询日志分析工具

官方文档:​​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

  

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

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

 

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

mysql性能——2慢查询_慢查询

 

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

mysql性能——2慢查询_mysql_02

 

在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

 

 



举报

相关推荐

0 条评论