将 MySQL 查询减少到一个查询以加快速度

Posted

技术标签:

【中文标题】将 MySQL 查询减少到一个查询以加快速度【英文标题】:Reduce MySQL queries to one query to speed up 【发布时间】:2016-12-12 16:28:26 【问题描述】:

在 general_log 文件中我有疑问:

160806  9:53:26      11 Connect     dbname@localhost on 
     11 Query       SET NAMES utf8
     11 Query       SET character_set_client="utf8"
     11 Query       SET character_set_connection="utf8"
     11 Query       SET character_set_database="utf8"
     11 Query       SET character_set_results="utf8"
     11 Query       SET character_set_server="utf8"
     11 Query       SET character_set_system="utf8"
     11 Init DB     dbname

是否可以进行 1 个查询而不是 7 个查询?它会显着加快速度吗?

【问题讨论】:

这是你的慢日志文件吗?这将是最不寻常的,因为这些查询根本不需要任何时间。 这类似于慢日志文件,它记录所有查询。我是 mysql 的新手,如果我每秒有 1000 次这样的查询,我会很感兴趣,这会显着降低服务器速度吗? 【参考方案1】:

查看我当前是否正在使用常规日志捕获流量:

SELECT @@general_log;   -- 1 if capturing, 0 if not
-- for me, a 1. This means I have been capturing (good for development. Poor idea for Production)

SELECT @@general_log_file; -- file name for General Log if capturing.
-- for me: GeneralLogBegin_20160803_1420.log

SELECT @@datadir; -- the location of the general_log, and other logs
-- for me: C:\ProgramData\MySQL\MySQL Server 5.6\Data\

现在我关闭下面的常规日志的捕获,因为我正在捕获:

SET GLOBAL general_log=0; -- stop logging

我将我的日志文件移动到备份目录,将其重命名为 GL_from_20160803_1420_to_20160806_1559

上述文件体现的捕获内容和日期时间范围几乎没有歧义。

设置日志文件捕获的新名称(文件名的开始段)

SET GLOBAL general_log_file='GeneralLogBegin_20160806_1559.log';
SET GLOBAL general_log=1; -- Start logging again

运行我的一个连接到服务器的应用程序,General Log 包含:

块A:

160806 16:08:37   170 Connect   MrSmithers@www.xxx.yyy.zzz on ***
          170 Query SHOW VARIABLES
          170 Query SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP())
          170 Query SHOW COLLATION
          170 Query SET NAMES latin1
          170 Query SET character_set_results=NULL
          170 Init DB   my_db_name

注意:您可能需要这样做

mysqladmin -u root -p flush-log

(提示输入密码)以便将日志从缓存刷新到文件。 顺便说一句,Sublime Text 非常适合自动刷新当前加载的文本文件。比如,一个日志文件。

所以我上面的ChunkA 是一个新连接的连接存根。它由正在使用的程序的命令驱动,无论它可能是什么。它在您习惯和编码的程序命令之前。如果您不断地创建新连接、执行您编写的代码并断开连接,那么这些都是包袱的一部分。您无法控制以任何简单的方式优化它们。

您应该考虑在生产环境中关闭常规查询日志。并且仅在调试和测试环境设置期间启用它。开启它会给你的堆栈增加不必要的负担。

【讨论】:

【参考方案2】:

https://dev.mysql.com/doc/refman/5.7/en/set-names.html 说:

[SET NAMES] 语句将三个会话系统变量 character_set_client、character_set_connection 和 character_set_results 设置为给定的字符集。将 character_set_connection 设置为 charset_name 也会将 collat​​ion_connection 设置为 charset_name 的默认排序规则。

因此您可以跳过SET NAMES 之后的几个语句。剩下的:

SET NAMES utf8;
SET character_set_database="utf8";
SET character_set_server="utf8";
SET character_set_system="utf8";

您应该阅读有关这些变量的manual:

character_set_database

默认数据库使用的字符集。每当默认数据库更改时,服务器都会设置此变量。如果没有默认数据库,则该变量的值与 character_set_server 相同。

你不需要设置这个。

character_set_server

服务器的默认字符集。

您无需在会话上下文中进行设置。在您的my.cnf 文件中全局设置它,不要管它。它的唯一用途是在您使用 CREATE DATABASE 时建立一个默认值,并且不为命名数据库显式定义字符集。

character_set_system

服务器用来存储标识符的字符集。该值始终为 utf8。

真的你永远无法改变这一点。

只剩下:

SET NAMES utf8;

【讨论】:

以上是关于将 MySQL 查询减少到一个查询以加快速度的主要内容,如果未能解决你的问题,请参考以下文章

MySql中的索引

假如mysql数据库单表有100W行记录,有哪些方式加快查询速度

添加 Limit 可以加快 mysql 查询速度,为啥?

Mysql中的索引

mysql limit 是不是能加快查询速度?

MySQL索引