MySql数据库慢查询

时间:2021-08-16 06:36:57

一、什么是数据库慢查询?

数据库慢查询,就是查询时间超过了我们设定的时间的语句。

可以查看设定的时间:

MySql数据库慢查询

默认的设定时间是10秒。也可以自己根据实际项目设定。

set long_query_time=0.0001;

二、MySQL 慢查询的相关参数解释:

slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。

log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log

slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log

long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。

log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。

log_output:日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql

慢查询日志配置:

默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启,如下所示:

show variables like 'slow_query%'; -- 慢查询

show variables like 'long_query_time'; -- 查询时间设置

show variables like '%slow_query_log%';-- 查看慢查询的日志配置

show variables like 'log_queries_not_using_indexes'; --查看未使用索引的

set global log_queries_not_using_indexes=1; -- 未使用索引的查询也被记录到慢查询日志中

show global status like '%slow_queries%';-- 查询慢查询记录

三、最大连接数的查看与设置

-- 1、查看最大连接数

show variables like '%max_connections%'; -- 上限连接数

SHOW GLOBAL STATUS LIKE 'Max_used_connections' -- 服务响应的最大连接数

比较理想的设置:Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

-- 2、修改最大连接数
set GLOBAL max_connections = 500;

-- 列出MySQL服务器运行各种状态值
SHOW GLOBAL STATUS;

四、常见的慢查询优化

1、索引没起到作用的情况

1)、使用LIKE关键字的查询语句        在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置索引才会起作用。

2)、 使用多列索引的查询语句        MySQL可以为多个字段创建索引。一个索引最多可以包括16个字段。对于多列索引,只有查询条件使用了这些字段中的第一个字段时,索引才会被使用。

2、优化数据库结构

1)、将字段很多的表拆解成多个表

2)、设置中间表

3、分解关联查询

很多高性能的应用都会对关联查询进行分解,就是可以对每一个表进行一次单表查询,然后将查询结果在应用程序中进行关联,很多场景下这样会更高效。

4、优化limit分页

  在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句。如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作。

一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高。

优化此类查询的一个最简单的方法是尽可能的使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候这样做的效率会得到很大提升。