如何对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 查询简介