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 】
相关推荐:
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何构建满足综合性能需求的优质建站方案?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
,在苏州找工作,上哪个网站比较好?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
JavaScript常见的五种数组去重的方式
Linux安全能力提升路径_长期防护思维说明【指导】
Android自定义控件实现温度旋转按钮效果
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
潮流网站制作头像软件下载,适合母子的网名有哪些?
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
lovemo网页版地址 lovemo官网手机登录
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
android nfc常用标签读取总结
再谈Python中的字符串与字符编码(推荐)
网页设计与网站制作内容,怎样注册网站?
如何快速选择适合个人网站的云服务器配置?
制作电商网页,电商供应链怎么做?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Bootstrap CSS布局之列表
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何快速搭建高效可靠的建站解决方案?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Android仿QQ列表左滑删除操作
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
如何用PHP快速搭建CMS系统?
详解vue.js组件化开发实践
b2c电商网站制作流程,b2c水平综合的电商平台?
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何在腾讯云服务器快速搭建个人网站?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何续费美橙建站之星域名及服务?
如何挑选高效建站主机与优质域名?

