MySQL启用慢查询日志记录方法
发布时间 - 2026-01-10 22:24:38 点击率:次在MySQL中,慢查询的界定时间是由MySQL内置参数变量long_query_time来指定的,其默认值为10(单位:秒),我们可以通过show variables like 'long_query_time';指令来查看该参数变量的信息:
long_query_time的默认值为10秒
不过,在程序开发过程中,我们认为慢速查询的界定时间并没有10秒这么长,依据不同项目的不同需求,我们一般将慢查询的界定时间设定为1~5秒之间。我们可以使用指令set long_query_time = 秒数来设定long_query_time变量的值。
设定long_query_time的值为1秒
修改了long_query_time参数后,我们还需要让MySQL能够记录下慢查询的日志信息。因为,在默认情况下,MySQL并不会记录慢查询的日志信息。如果要记录慢查询日志,我们需要以命令行方式进入MySQL安装目录in目录(也可将该目录添加到PATH环境变量中),使用如下命令重新启动MySQL:
#中括号[]内的部分是可选的,file_name表示日志文件路径 #在5.5及以上版本的MySQL中,使用如下命令启动: mysqld --show-query-log[=1] [--show-query-log-file=file_name] #在5.0、5.1等低版本的MySQL中,使用如下命令启动: mysqld --log-slow-queries[=file_name]
在上述命令中,如果没有指定日志文件名,则日志文件名称默认为主机名-slow.log;如果没有指定文件路径或者指定的文件路径不是绝对路径,则日志文件将默认存放在MySQL配置文件my.ini中参数datadir所指定的目录下。
此外,你也可以将上述命令行启动命令配置到my.ini中的[mysqld]节点下,这样无需每次手动键入上述命令来启动。
[mysqld] #设置慢查询界定时间为1秒 long_query_time=1 #5.0、5.1等版本配置如下选项 log-slow-queries="mysql_slow_query.log" #5.5及以上版本配置如下选项 slow-query-log=On slow_query_log_file="mysql_slow_query.log"
注意:虽然慢查询的名字中只包含了”查询”,实际上并不仅仅表示SELECT查询操作,诸如INSERT、UPDATE、DELETE、CALL等其他DML操作,只要是超过指定时间的,都可以称之为“慢查询”,并且会记录在慢查询日志中。
这个时候,我们就需要使用EXPLAIN指令来获取SELECT语句执行的细节信息。在MySQL中数据库中,EXPLAIN指令的用法非常简单,如下所示:
EXPLAIN SELECT语句
--例如:EXPLAIN SELECT * FROM admin WHERE user_id = 1;
如果是在Oracle数据库中,我们同样可以使用如下SQL语句来获取SELECT语句的执行计划信息:
EXPLAIN PLAN FOR SELECT语句 --例如:EXPLAIN PLAN FOR SELECT * FROM admin WHERE user_id = 1;
在这里,我们以MySQL为例,在数据库中执行上述EXPLAIN指令,将会输出如下结果(user_id是admin表的主键列):
为了进一步说明上述执行计划信息所表示的含义,我们再次执行带格式化的EXPLAIN命令
EXPLAIN SELECT * FROM admin WHERE user_id = 1G;
(G在MySQL中表示格式化输出结果),我们将会得到如下信息:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: admin
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 1
ref: const
rows: 1
Extra:
1 row in set (0.00 sec)
下面,我们来详细介绍上述输出结果中每个字段信息所表示的含义:
id
SELECT识别符。这是SELECT的查询序号。
select_type
SELECT类型,可以为以下任何一种:
SIMPLE
简单SELECT(不使用UNION或子查询)。
PRIMARY
最外面的SELECT
UNION
UNION中的第二个或后面的SELECT语句。
DEPENDENT UNION
UNION中的第二个或后面的SELECT语句,取决于外面的查询。
UNION RESULT
UNION的结果。
SUBQUERY
子查询中的第一个SELECT。
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询。
DERIVED
导出表的SELECT(FROM子句的子查询)。
table
输出的行所引用的表。
type
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
system
表仅有一行(=系统表)。这是const联接类型的一个特例。
const
表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
eq_ref
对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。
ref
对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。ref可以用于使用=或<=>操作符的带索引的列。
ref_or_null
该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。
index_merge
该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。
unique_subquery
该类型替换了下面形式的IN子查询的ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)。 unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
index_subquery
该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
range
只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。 当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。
index
该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。 当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。
ALL
对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。
possible_keys
possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意,该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。 如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询。
key
key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。注意通过key_len值我们可以确定MySQL将实际使用一个多部关键字的几个部分。
ref
ref列显示使用哪个列或常数与key一起从表中选择行。
rows
rows列显示MySQL认为它执行查询时必须检查的行数。
Extra
该列包含MySQL解决查询的详细信息。下面解释了该列可以显示的不同的文本字符串:
Distinct
MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
Not exists
MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。 下面是一个可以这样优化的查询类型的例子:SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;假定t2.id定义为NOT NULL。在这种情况下,MySQL使用t1.id的值扫描t1并查找t2中的行。如果MySQL在t2中发现一个匹配的行,它知道t2.id绝不会为NULL,并且不再扫描t2内有相同的id值的行。换句话说,对于t1的每个行,MySQL只需要在t2中查找一次,无论t2内实际有多少匹配的行。
range checked for each record (index map: #)
MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来索取行。 这并不很快,但比执行没有索引的联接要快得多。
Using filesort
MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。
Using index
从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略。
Using temporary
为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。
Using where
WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。 如果想要使查询尽可能快,应找出Using filesort 和Using temporary的Extra值。
Using sort_union(...), Using union(...), Using intersect(...)
这些函数说明如何为index_merge联接类型合并索引扫描。
Using index for group-by
类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。
# MySQL
# 慢查询
# 详解MySql的慢查询分析及开启慢查询日志
# MySQL慢查询优化之慢查询日志分析的实例教程
# MySQL慢查询日志的配置与使用教程
# MySQL 开启慢查询日志的方法
# 对MySQL慢查询日志进行分析的基本教程
# MySQL开启慢查询日志功能的方法
# MySQL优化方案之开启慢查询日志
# 详解mysql数据库如何开启慢查询日志
# MySQL慢查询日志超详细总结
# 可以使用
# 子句
# 第一个
# 如果没有
# 来自于
# 是一个
# 这是
# 在这种情况下
# 数据库中
# 值为
# 将会
# 我们可以
# 第二个
# 所示
# 包含了
# 类似于
# 慢速
# 命令行
# 情况下
# 几个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解vue.js组件化开发实践
如何快速搭建高效WAP手机网站吸引移动用户?
再谈Python中的字符串与字符编码(推荐)
如何破解联通资金短缺导致的基站建设难题?
魔方云NAT建站如何实现端口转发?
如何续费美橙建站之星域名及服务?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何用狗爹虚拟主机快速搭建网站?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
JavaScript如何实现继承_有哪些常用方法
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel如何生成URL和重定向?(路由助手函数)
BootStrap整体框架之基础布局组件
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
网站图片在线制作软件,怎么在图片上做链接?
Swift中循环语句中的转移语句 break 和 continue
百度浏览器如何管理插件 百度浏览器插件管理方法
什么是javascript作用域_全局和局部作用域有什么区别?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Laravel如何实现数据库事务?(DB Facade示例)
JavaScript如何操作视频_媒体API怎么控制播放
php 三元运算符实例详细介绍
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
JavaScript实现Fly Bird小游戏
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何在万网ECS上快速搭建专属网站?
怎么用AI帮你为初创公司进行市场定位分析?
如何快速选择适合个人网站的云服务器配置?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Python文本处理实践_日志清洗解析【指导】
*服务器网站为何频现安全漏洞?
如何在腾讯云免费申请建站?
JS弹性运动实现方法分析
在线制作视频的网站有哪些,电脑如何制作视频短片?
新三国志曹操传主线渭水交兵攻略
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
个人网站制作流程图片大全,个人网站如何注销?
西安专业网站制作公司有哪些,陕西省建行官方网站?
郑州企业网站制作公司,郑州招聘网站有哪些?

