zoukankan      html  css  js  c++  java
  • MySQL慢日志查询实践

    慢日志查询作用

    慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志中. 慢查询主要是为了我们做sql语句的优化功能.

    慢查询配置项说明

    登录mysql服务,使用如下命令

    1. mysql> show variables like '%query%';
    2. +------------------------------+-----------------------------------------+
    3. | Variable_name | Value |
    4. +------------------------------+-----------------------------------------+
    5. | binlog_rows_query_log_events | OFF |
    6. | ft_query_expansion_limit | 20 |
    7. | have_query_cache | YES |
    8. | long_query_time | 10.000000 |
    9. | query_alloc_block_size | 8192 |
    10. | query_cache_limit | 1048576 |
    11. | query_cache_min_res_unit | 4096 |
    12. | query_cache_size | 33554432 |
    13. | query_cache_type | OFF |
    14. | query_cache_wlock_invalidate | OFF |
    15. | query_prealloc_size | 8192 |
    16. | slow_query_log | OFF |
    17. | slow_query_log_file | /usr/local/mysql/var/localhost-slow.log |
    18. +------------------------------+-----------------------------------------+
    19. 13 rows in set (0.01 sec)

    这里,我们只需要关注三个配置项即可。 1.slowquerylog 该配置项是决定是否开启慢日志查询功能,配置的值有ON或者OFF. 2.slowquerylogfile 该配置项是慢日志查询的记录文件,需要手动创建. 3.longquery_time 该配置项是设置慢日志查询的时间阈值,当超过这个阈值时,慢日志才会被记录.配置的值有0(任何的sql语句都记录下来),或者>0(具体的阈值).该配置项是以秒为单位的,并且可以设置为小数. 4.log-queries-not-using-indexes 该配置项是为了记录未使用到索引的sql语句.

    如何配置慢查询

    配置慢查询功能的方式有两种,一种是使用mysql的配置文件配置,另外一种是使用mysql命令配置.这里建议使用配置文件配置,因为在命令配置的过程中发现有时候配置项在set命令的时候是成功了,但是查询还是没设置。 1.配置文件配置

    1. // 找到[mysqld],在其下面添加如下代码即可.
    2. slow_query_log=ON
    3. slow_query_log_file=/usr/local/mysql/var/localhost-slow.log
    4. long_query_time=0
    5. log-queries-not-using-indexes = 1
    6. // 配置好后,重启mysql服务

    2.使用命令配置

    1. // 这里就简单些一个配置项就行了,其他的配置项均按照此方法配置
    2. mysql> set slow_query_log=ON;

    配置好之后,查看mysql慢查询日志是否配置成功.

    1. mysql> show variables like '%query%';
    2. +------------------------------+-----------------------------------------+
    3. | Variable_name | Value |
    4. +------------------------------+-----------------------------------------+
    5. | binlog_rows_query_log_events | OFF |
    6. | ft_query_expansion_limit | 20 |
    7. | have_query_cache | YES |
    8. | long_query_time | 0.000000 |
    9. | query_alloc_block_size | 8192 |
    10. | query_cache_limit | 1048576 |
    11. | query_cache_min_res_unit | 4096 |
    12. | query_cache_size | 33554432 |
    13. | query_cache_type | OFF |
    14. | query_cache_wlock_invalidate | OFF |
    15. | query_prealloc_size | 8192 |
    16. | slow_query_log | ON |
    17. | slow_query_log_file | /usr/local/mysql/var/localhost-slow.log |
    18. +------------------------------+-----------------------------------------+
    19. 13 rows in set (0.01 sec)

    如何查看慢日志记录

    在配置慢查询之前,我们已经导入了示例的数据文件,这里就不做单独的演示了。mysql官方数据库示例 。接下来,我们就开始做查询操作.

    1. mysql> select * from city where city='Salala';
    2. +---------+--------+------------+---------------------+
    3. | city_id | city | country_id | last_update |
    4. +---------+--------+------------+---------------------+
    5. | 444 | Salala | 71 | 2006-02-15 04:45:25 |
    6. +---------+--------+------------+---------------------+
    7. 1 row in set (0.01 sec)

    此时,我们根据配置的慢查询日志记录文件/usr/local/mysql/var/localhost-slow.log,发现该文件记录了上面的命令操作.

    1. # Time: 2019-01-17T08:12:27.184998Z
    2. # User@Host: root[root] @ localhost [] Id: 4
    3. # Query_time: 0.002773 Lock_time: 0.001208 Rows_sent: 1 Rows_examined: 600
    4. SET timestamp=1547712747;
    5. select * from city where city='Salala';

    上诉文件配置内容说明 1.Time 该日志记录的时间 2.User@Host MySQL登录的用户和登录的主机地址 3.Querytime一行 第一个时间是查询的时间、第二个是锁表的时间、第三个是返回的行数、第四个是扫描的行数 4.SET timestamp 这一个是MySQL查询的时间 5.sql语句 这一行就很明显了,表示的是我们执行的sql语句 总结 由于我们配置longquerytime=0,因此所有的sql语句都将被记录下来,这里我们假设,仅仅是假设。我们设置的longquerytime=5,然而上面的第三项中Querytime大于5,如果是实际项目中不属于正常范围,则需要对其进行优化,当然优化的方式有很多种,下面我们使用简单的索引方式进行优化一下。

    优化sql语句

    1.先查看原本的sql语句执行结构

    1. mysql> explain select * from city where city='Salala'G;
    2. *************************** 1. row ***************************
    3. id: 1
    4. select_type: SIMPLE
    5. table: city
    6. partitions: NULL
    7. type: ALL
    8. possible_keys: NULL
    9. key: NULL
    10. key_len: NULL
    11. ref: NULL
    12. rows: 600
    13. filtered: 10.00
    14. Extra: Using where
    15. 1 row in set, 1 warning (0.00 sec)
    16. mysql> create index idx_cityName on city(`city`);
    17. Query OK, 0 rows affected (0.03 sec)
    18. Records: 0 Duplicates: 0 Warnings: 0

    看得出,该sql语句是进行了全盘扫描。我们则用索引对其简单的优化一下。 2.创建索引

    1. mysql> create index idx_cityName on city(`city`);
    2. Query OK, 0 rows affected (0.03 sec)
    3. Records: 0 Duplicates: 0 Warnings: 0

    3.在用explain分析一次

    1. mysql> explain select * from city where city='Salala'G;
    2. *************************** 1. row ***************************
    3. id: 1
    4. select_type: SIMPLE
    5. table: city
    6. partitions: NULL
    7. type: ref
    8. possible_keys: idx_cityName
    9. key: idx_cityName
    10. key_len: 152
    11. ref: const
    12. rows: 1
    13. filtered: 100.00
    14. Extra: NULL
    15. 1 row in set, 1 warning (0.00 sec)

    通过创建索引,我们发现此时只扫描了一行,并且是使用的索引扫描,因此大大提高了一个mysql查询的效率。

    MySQL慢查询使用总结

    在平常的开发中,慢查询作为MySQL优化的一个途径,是非常有用的。它会记录下我们一些查询时间长的sql语句,对其语句我们进行分析,从而达到sql查询语句的最优化。但是慢日志查询开启之后,针对sql查询会通过磁盘I/O将相关的记录写入到磁盘文件中,增加了一个磁盘的I/O读写。因此,我们该功能用在开发、测试环境上,而不用在生产环境中去。

    慢日志查询工具

    由于慢日志查询文件越到后期,内容越多。我们对其分析的压力越大,因此我们需要借助某些工具实现快速分析。这些工具还没完全使用熟悉,后期单独写一篇文章介绍该类型的工具,这里只是罗列一下工具名称。 1.mysqldumpslow 2.pt-query-digest 3.mysqltop(天兔Lepus)

  • 相关阅读:
    Saltstack module acl 详解
    Saltstack python client
    Saltstack简单使用
    P5488 差分与前缀和 NTT Lucas定理 多项式
    CF613D Kingdom and its Cities 虚树 树形dp 贪心
    7.1 NOI模拟赛 凸包套凸包 floyd 计算几何
    luogu P5633 最小度限制生成树 wqs二分
    7.1 NOI模拟赛 dp floyd
    springboot和springcloud
    springboot集成mybatis
  • 原文地址:https://www.cnblogs.com/qqblog/p/10284881.html
Copyright © 2011-2022 走看看