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

时间:2016-08-06 10:09:39

标签: mysql character-set

在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次查询?它会明显加速吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

设置日志文件捕获的新名称(文件名的Begin segment)

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

运行我的连接到服务器的应用程序,并且常规日志包含:

ChunkA:

160806 16:08:37   170 Connect   MrSmithers@www.xxx.yyy.zzz on stackoverflow
          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是新连接的连接存根。它由正在使用的程序的命令驱动,无论可能是什么。它是您习惯的程序命令之前的代码。如果您不断创建新连接,执行您编写的代码并断开连接,那么这些都是行李的一部分。你无法以任何简单的方式控制它们的优化。

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

答案 1 :(得分:0)

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;