Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL中的慢速查询;慢速查询日志";-但同样的查询手动运行得非常快_Mysql_Sql_Database_Performance - Fatal编程技术网

MYSQL中的慢速查询;慢速查询日志";-但同样的查询手动运行得非常快

MYSQL中的慢速查询;慢速查询日志";-但同样的查询手动运行得非常快,mysql,sql,database,performance,Mysql,Sql,Database,Performance,正如标题所述,在我的数据库中,各种查询出现在慢速查询日志中,但当我手动运行它们时,它们的运行速度要快10倍 例如,一个相对简单的带有多个order by参数的select查询在日志中通常需要100秒(yes表非常大)。。。但当我自己在同一个DB上运行它时,需要2秒钟左右 我检查了服务器的性能,当时似乎没有特别的减速或瓶颈,也没有很多查询在这段时间花费很长时间,但只有一个 我怎样才能开始分析这样一个问题呢 感谢您的帮助当有问题的查询进入慢速日志时,您的系统可能会更忙 如果所检查的行数大于结果集,则

正如标题所述,在我的数据库中,各种查询出现在慢速查询日志中,但当我手动运行它们时,它们的运行速度要快10倍

例如,一个相对简单的带有多个order by参数的select查询在日志中通常需要100秒(yes表非常大)。。。但当我自己在同一个DB上运行它时,需要2秒钟左右

我检查了服务器的性能,当时似乎没有特别的减速或瓶颈,也没有很多查询在这段时间花费很长时间,但只有一个

我怎样才能开始分析这样一个问题呢


感谢您的帮助

当有问题的查询进入慢速日志时,您的系统可能会更忙

如果所检查的行数大于结果集,则慢速日志可能表明索引未被充分利用。因此,执行时间应该被视为查询有问题的线索,但所检查的行将为您提供更明确的答案

在高负载的服务器上,查询时间是一个糟糕的性能度量,因为在繁忙的服务器上,任何查询都可能很慢。您应该使用EXPLAIN and SHOW PROFILE来分析查询并改进它们,这样它们就不会给服务器带来太多负载


分析查询时,请使用
选择SQL\u NO\u缓存…
,这样结果就不会存储在查询缓存中,否则同一查询的后续执行可能会使用查询缓存,从而扭曲查询的任何时间。

我会先在此处发布一个这样的查询,以帮助分析它以及“解释选择…”显示引擎希望对其查询执行路径执行的操作。通常,如果查询需要1秒或更长时间,则会被慢速查询日志捕获。2秒肯定比1秒高。胡乱猜测:手动运行查询时,查询速度很快,因为结果是在第一次执行查询时缓存的。要检查它,请清除所有缓存,然后再次尝试相同的查询-这应该需要100秒。您也可以尝试询问:关于缓存:当我手动运行查询时(仍然在服务器上,而不是在本地,在同一数据库上),我更改了某些条件的顺序,因此无法将结果与以前运行的查询相匹配。我已经运行了explain,它确实显示它使用了一些索引,但我真的不确定它们是否正确。在“可能的索引”列表中有许多其他未使用的索引。我还注意到,扫描的行数大大超过实际获取的行数。事实上,语句本身限制为50行,扫描的行数大约为3000行。我的想法是,这是由于语句中的orderby,据我所知,它获取所有行(即使查询有限制),并且仅在orderby返回50之后。这是正确的吗?@MikiBergin,如果orderby子句可以由索引提供服务,那么它就不必获取所有的行。这里有一些警告,但这里讨论的太多了。我建议,如果您需要帮助优化特定查询,请发布一个单独的问题,包括整个查询、相关架构以及解释和显示配置文件结果。@MikiBergin,连续尝试查询速度更快的另一个原因是,如果您的系统没有足够的RAM在内存中存储所有索引,因此,它必须将索引从磁盘交换到内存中。在第二次尝试时,索引可能已加载到内存中。检查内存配置。