如何解决MySQL查询问题

有时用户一旦开始对其数据发出查询就会遇到问题。在某些数据库系统(包括MySQL)中,查询语句必须以分号(;)结尾才能完成查询,如下例所示......

本系列的一部分: 如何解决MySQL中的问题

本指南旨在用作诊断MySQL设置时的故障排除资源和起点。 我们将讨论许多MySQL用户遇到的一些问题,并提供解决特定问题的指导。 我们还将包含指向DigitalOcean教程的链接以及在某些情况下可能有用的官方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查询简介


分享按钮