Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 - Fatal编程技术网

Mysql 长时间运行的不重要查询会减慢其他查询的速度

Mysql 长时间运行的不重要查询会减慢其他查询的速度,mysql,sql,Mysql,Sql,我有一个cronjob,它每5分钟执行一次长时间运行的查询。此查询不是时间关键型的,目前需要大约30秒才能完成 问题是,在执行查询时,所有其他查询的运行速度都要慢得多 查询非常简单(没有连接,使用索引等),但读取大量数据(150万行,每行大约150字节数据) 我无法轻松缓存结果,因为所有数据都可以随时更改 有没有办法限制这个特定的查询 编辑: 查询实际上只是: SELECT field1,field2 FROM table; 编辑2: 好吧,很抱歉这么说,但你们每个人都没有抓住重点。我在问我是

我有一个cronjob,它每5分钟执行一次长时间运行的查询。此查询不是时间关键型的,目前需要大约30秒才能完成

问题是,在执行查询时,所有其他查询的运行速度都要慢得多

查询非常简单(没有连接,使用索引等),但读取大量数据(150万行,每行大约150字节数据)

我无法轻松缓存结果,因为所有数据都可以随时更改

有没有办法限制这个特定的查询

编辑: 查询实际上只是:

SELECT field1,field2 FROM table;
编辑2: 好吧,很抱歉这么说,但你们每个人都没有抓住重点。我在问我是否可以限制查询,而我得到的所有答案根本没有解决这个问题。你们都告诉我更改cronjob(我知道我可以),从cli运行它(我不想),以块的形式获取数据等等

我再次明确地问我是否可以以某种方式将MySQL SELECT查询执行为“不重要”,以便它不会从其他查询中窃取所有资源?


很抱歉,如果这听起来像是一个重大的咆哮,我非常感谢您花时间提供帮助:)

如果您可以完全从命令行调用您的查询(并且假设您在Linux/UNIX/OS X系统上运行),您可以使用
nice
降低调度优先级,例如:

nice-n19 mysql-u vivek-p-e“从引号中选择计数(*)”cbzquotes


执行查询可能需要更长的时间,但不应该对其他进程产生如此负面的影响。

您可以在PHP中创建一个循环,以批量(比如100000行)的方式检索数据,每个批之间的睡眠时间为几毫秒。不完美,但这会给其他查询更多的机会。

在30秒内从MySQL服务器获取500万行数据到客户端(cronjob进程)发出此查询是相当不错的性能。你不会有太多的改进

(我想你可以投资超高性能的数据中心设备来改进它;在这种情况下,你可能会把它翻一番。这还不足以解决每五分钟一次的减速问题)

您的系统变慢的原因是MySQL试图将一致的结果返回给您的
SELECT
操作。在将结果推送到客户机时,它会对表进行排队或延迟插入和更新

你怎样才能解决这个问题?最好的方法是修复cronjob进程。理想的情况是在数据库系统中而不是在cronjob中运行计算。就是像这样

SELECT SUM(column) AS colsum, MAX(column2) AS colmax, DATE(timecolumn) AS day
  FROM table
 GROUP BY DATE(timecolumn)
您还没有告诉我们您的cronjob对这500万行做了什么,所以我只是以这个查询为例。这类操作将处理表,但返回的行要少得多。它也可以被优化

第二个最好的解决方案是逐块而不是全部检索行

另一个解决方案是将表切换到MyISAM。这消除了事务语义。它可能会把应用程序的其余部分搞砸

如果需要,您还可以构建一个从MySQL服务器,用于此类报告查询

现在可能不允许您更改cronjob或基础结构。如果你不能进行任何算法或基础设施的改变,你可能有一个候选人。没有什么魔法能让海量数据传输速度提高数百倍。

谷歌给出了与您面临的问题相同的答案。本文描述了一个正在读取整个表并使用大量I/O的查询;解决方案是一次读取1000行,然后在检索这些行所需的时间内睡眠

我不确定这是否能解决你的问题,但这似乎是一个可靠的解决方案

下面的代码是从链接中复制的,稍作修改即可回答您的问题:

SELECT
  field1, field2, 
    CASE
      WHEN (@row_counter := @row_counter + 1) IS NULL THEN NULL
      WHEN @row_counter % 1000 = 0 THEN
        CASE
          WHEN (@time_now := SYSDATE()) IS NULL THEN NULL
          WHEN (@time_diff := (TIMESTAMPDIFF(SECOND, @chunk_start_time, @time_now))) IS NULL THEN NULL
          WHEN SLEEP(@time_diff) + test.prove_it(CONCAT('will sleep for ', @time_diff, ' seconds')) IS NULL THEN NULL
          WHEN (@chunk_start_time := SYSDATE()) IS NULL THEN NULL
          ELSE 0
        END
      ELSE 0
    END AS rental_id,
  TIMESTAMPDIFF(DAY, rental_date, return_date) AS rental_days
FROM
  table,
  (SELECT @row_counter := 0) sel_row_counter,
  (SELECT @chunk_start_time := NOW()) sel_chunk_start_time
;

为什么要在每30秒运行一次的作业中返回150万行?行要去哪里?作业每5分钟运行一次,查询大约需要30秒才能完成。我需要数据来计算东西(太长了,这里无法解释,但我需要所有的数据)。是的,但是数据是怎么回事?移动150万行几乎可以肯定是速度减慢的原因,除非您能够避免移动(即如果它要返回mysql,那么您可以使用INSERT…SELECT吗?)@smoove。您应该看看是否可以在数据库中比在php中做更多的工作。在php中工作就是将数据从数据库移动到应用程序层。我想这取决于“它用于计算(php中)”的方式-您可能可以在mysql中进行这些计算。很抱歉,我不能,查询是cronjob(用php编写)的一部分,我需要脚本中的数据。在我看来,通过shell_exec仍然可以,否?和/或从文件读取。(我认为shell_exec将命令的输出作为一个字符串来处理,150万条记录会将其彻底破坏。降低MySQL客户端的优先级只会延长运行有问题的查询所需的时间。降低客户端优先级不会影响
mysqld
优先级。兆行等于千行1千行等于1000行。那么yottarow是什么呢?yottarow是很多行。具体来说,它是10行的幂(8*3)。希腊语中的8是οκτώ,不知怎的被扭曲成了“yoto”