MySQL 如何在不将查询结果输出到控制台的情况下检查MySQL查询所用的时间
在开发或运维过程中,我们常常需要执行MySQL查询并统计其运行时间。但是默认情况下,MySQL只会将查询结果输出到控制台,无法直接获得其运行时间。这时,我们可以使用MySQL提供的一些工具或技巧来实现这个需求。
阅读更多:MySQL 教程
方案一:使用MySQL内置命令
MySQL内置了一个名为“\timing”的命令,能够将当前会话中执行的每个SQL语句的执行时间输出到控制台。这种方式可以帮助我们快速地了解SQL查询的性能。
mysql> \timing
执行该命令后,MySQL会在控制台输出类似下面的信息:
Timing is ON.
mysql> SELECT * FROM my_table;
+----+--------+
| id | name |
+----+--------+
| 1 | Alice |
| 2 | Bob |
+----+--------+
2 rows in set (0.001 sec)
其中,“2 rows in set (0.001 sec)”中的“0.001 sec”就是该SQL语句的执行时间。
方案二:使用MySQL Profiler
MySQL Profiler是一个适用于MySQL 5.x版本的性能分析工具,可以用于收集查询的执行时间,并把这些数据存储在一个特殊的表中,以便随后进行分析。
在使用MySQL Profiler之前,需要先创建一个名为“Profiler”的数据库,并创建一个名为“query_time”的表:
CREATE DATABASE Profiler;
USE Profiler;
CREATE TABLE query_time (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
query_text TEXT NOT NULL,
execute_time FLOAT(5,3) NOT NULL,
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
然后在MySQL配置文件中添加以下内容:
[mysqld]
# 开启general_log
general_log = 1
# 记录日志文件的位置
general_log_file = /var/log/mysql/mysql.log
# 打印查询和执行时间
log_output = FILE
log_queries_not_using_indexes = ON
接下来,重启MySQL,并执行以下SQL语句开启查询分析:
SET GLOBAL log_queries_not_using_indexes = On;
SET GLOBAL general_log = Off;
SET GLOBAL general_log = On;
之后,所有执行的SQL语句和执行时间信息都会被记录到“/var/log/mysql/mysql.log”文件中。我们可以定期将其中的数据导入到“Profiler”库中:
LOAD DATA INFILE '/var/log/mysql/mysql.log'
INTO TABLE query_time
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
(`event_time`, `user_host`, `thread_id`, `server_id`, `command_type`, `query_text`);
最后,我们可以通过以下SQL语句查询该表中的数据,得到我们所需的查询执行时间:
SELECT query_text, execute_time
FROM query_time
WHERE query_text LIKE 'SELECT%'
ORDER BY create_time DESC;
方案三:使用MySQL的CLI工具
MySQL的CLI工具中提供了一个“–show-warnings”命令参数,当其被设定为“–show-warnings=1”时,可以在结果集后显示查询执行的时间信息。
mysql -u root -p --show-warnings=1 -e "SELECT * FROM my_table;"
执行后,MySQL会输出类似下面的信息:
id name
1 Alice
2 Bob
2 row(s) in 0.002 sec
其中,“2 row(s) in 0.002 sec”就是该SQL语句的执行时间。
结论
通过以上三种方式,我们可以很方便地获取MySQL查询的执行时间,使得开发人员和运维人员能够更好地掌控系统运行情况。
极客笔记