有时用户在开始对其数据发出查询时会遇到问题。在一些数据库系统(包括 MySQL)中,查询语句必须以分号(;
)结尾才能完成查询,就像下面的例子一样:
SHOW * FROM table_name;
如果你在查询的末尾没有包含分号,提示符会继续显示在新的一行,直到你输入分号并按下 ENTER
键来完成查询。
一些用户可能会发现他们的查询非常慢。找出哪个查询语句导致了减速的一种方法是启用并查看 MySQL 的慢查询日志。要做到这一点,打开你的 mysqld.cnf
文件,该文件用于配置 MySQL 服务器的选项。这个文件通常存储在 /etc/mysql/mysql.conf.d/
目录中:
sudo nano /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
文件中运行而没有使用索引的查询。这个设置并不是慢查询日志功能的必需条件,但它有助于发现低效的查询。
通过去掉每行开头的井号(#
)来取消注释这些行。现在这一部分看起来是这样的:
. . .
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 查询入门》。