如何对MySQL查询进行故障排除
有时,一旦用户开始对他们的数据发出查询,他们就会遇到问题。 在包括 MySQL 在内的一些数据库系统中,查询语句必须以分号 (;
) 结尾才能完成查询,如下例所示:
SHOW * FROM table_name;
如果您未能在查询末尾包含分号,则提示将在新行上继续,直到您通过输入分号并按 ENTER
完成查询。
一些用户可能会发现他们的查询非常慢。 找出哪个查询语句导致减速的一种方法是启用并查看 MySQL 的慢查询日志。 为此,请打开您的 mysqld.cnf
文件,该文件用于配置 MySQL 服务器的选项。 此文件通常存储在 /etc/mysql/mysql.conf.d/
目录中:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
滚动文件,直到看到以下行:
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . #slow_query_log = 1 #slow_query_log_file = /var/log/mysql/mysql-slow.log #long_query_time = 2 #log-queries-not-using-indexes . . .
这些注释掉的指令为慢查询日志提供 MySQL 的默认配置选项。 具体来说,这是他们每个人的工作:
slow-query-log
:将此设置为1
启用慢查询日志。slow-query-log-file
:这定义了 MySQL 将记录任何慢查询的文件。 在这种情况下,它指向/var/log/mysql-slow.log
文件。long_query_time
:通过将此指令设置为2
,它将 MySQL 配置为记录任何需要超过 2 秒才能完成的查询。log_queries_not_using_indexes
:这告诉 MySQL 也将任何没有索引运行的查询记录到/var/log/mysql-slow.log
文件中。 慢查询日志运行不需要此设置,但它有助于发现低效查询。
通过删除前导井号 (#
) 取消注释每一行。 该部分现在将如下所示:
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes . . .
注意: 如果你运行 MySQL 8+,这些注释行默认不会出现在 mysqld.cnf
文件中。 在这种情况下,将以下行添加到文件底部:
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes
启用慢查询日志后,保存并关闭文件。 然后重启 MySQL 服务:
sudo systemctl restart mysql
有了这些设置,您可以通过查看慢查询日志找到有问题的查询语句。 您可以使用 less
执行此操作,如下所示:
sudo less /var/log/mysql_slow.log
一旦你挑出了导致速度变慢的查询,你可能会发现我们关于如何在 VPS 上优化 MySQL 和 MariaDB 中的查询和表的指南有助于优化它们。
此外,MySQL 包括 EXPLAIN
语句,它提供有关 MySQL 如何执行查询的信息。 MySQL 官方文档 中的此页面提供了有关如何使用 EXPLAIN
突出显示低效查询的见解。
如需了解基本查询结构的帮助,请参阅我们的 MySQL 查询简介。