Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Php Mysql CPU 100%-无慢速查询_Php_Mysql_Ajax - Fatal编程技术网

Php Mysql CPU 100%-无慢速查询

Php Mysql CPU 100%-无慢速查询,php,mysql,ajax,Php,Mysql,Ajax,我有一个通过vpn调用mysql数据库的web应用程序 有时(当许多客户使用该系统时),来自远程mysql主机的cpu达到100%,而一切都变得非常缓慢(我甚至收到错误500) 我打开了慢速查询日志,里面什么都没有 我看到了processlist,有一些查询(大约30个,这是正常的,因为我使用了很多ajax),它们对数据进行排序 执行此操作的查询是(填写数字): 我在数据库的本地副本上运行上述操作,执行时间为0.0027 我去掉了时差和排序,执行时间差很小 在GoogleChrome上,我看到a

我有一个通过vpn调用mysql数据库的web应用程序

有时(当许多客户使用该系统时),来自远程mysql主机的cpu达到100%,而一切都变得非常缓慢(我甚至收到错误500)

我打开了慢速查询日志,里面什么都没有

我看到了processlist,有一些查询(大约30个,这是正常的,因为我使用了很多ajax),它们对数据进行排序

执行此操作的查询是(填写数字):

我在数据库的本地副本上运行上述操作,执行时间为0.0027

我去掉了时差和排序,执行时间差很小

在GoogleChrome上,我看到ajax响应有时超过30秒

db服务器的任务管理器显示主要负载是mysql.exe

你们有没有线索可以帮我解决这个问题

你认为是查询还是服务器的问题

更新

Ajax呼叫每天下午最多等待30秒!! cpu使用率似乎达到了100%

它们不允许在服务器上应用索引


如果您有任何想法,我将不胜感激。

由于本条款的存在,您的
左连接
被迫成为
内部连接

 WHERE c.caller_id = cs.caller_id
这样写你的ON子句,你就会解决这个问题

ON c.call_start = cs.call_start AND c.caller_id = cs.caller_id
您向我们展示的查询可以显著优化,特别是在
calllscallshop
表有大量行的情况下。为什么?您正在以某种方式执行日期范围搜索。让我们来解决这个问题

您似乎遇到了生产紧急情况--
500条
消息等等--所以让我们先把事情安排好,最简单的一步

首先,在
calllscallshop
表中创建一个。让我看看。您的查询在
呼叫者\u id
发票\u id
上查找相等项。它在
id\u客户端
上查找集合包含。它需要在
call\u start
上进行范围扫描

因此,让我们将此索引添加到
calllscallshop
(呼叫者id、发票id、呼叫开始、id客户)
。尽快这样做,看看你的问题是否有所改善。您可以添加索引,而无需更改一行软件

另外,将此索引添加到
呼叫
(呼叫方id,呼叫开始)

其次,我们需要更有效地进行本周搜索。作为奖励,我们所做的更改将解决您在每个日历年开始时遇到的问题。你是这样做的

  year(cs.call_start) = year(now()) AND    /* slow */
  month(cs.call_start) = month(now()) AND  /* slow */
  week(cs.call_start) = week(now())        /* slow, wrong at year-end */
如果希望此搜索可搜索,则需要以下内容:

    cs.call_start >= midnight on the first day of this week
AND cs.call_start <  midnight on the first day of next week
这是因为
DAYOFWEEK()
返回Sunday=1、Monday=2等。因此,要获取任何一天的前一个星期日,我们将备份
DAYOFWEEK()-1
days

因此,让我们这样编写日期范围搜索:

    cs.call_start >= CURDATE()-INTERVAL DAYOFWEEK(CURDATE())-1 DAY
AND cs.call_start <  CURDATE()-INTERVAL DAYOFWEEK(CURDATE())-1 DAY + INTERVAL 7 DAY
如果需要,可以获取每周的数据摘要


还有一件事:在处理生产数据时,执行
SELECT*
被认为是有害的。相反,您应该指定所需的确切列。

奥利斯的建议非常有用,但没有解决问题

问题不是直接出现在sql中,而是与php代码有关

更清楚地说:

  • 每个呼叫室都有多个呼叫舱
  • 我正在创建一个连接,并为每个客舱执行一个查询
解决这个问题的方法是对多个舱室执行查询,因此每秒的连接和查询执行更少

ajax调用响应从30秒下降到850毫秒


谢谢Ollie,您的建议使我的代码更快、更简洁。

谢谢您给出了非常清晰、漂亮的答案!我应用了除索引之外的一切,在新的数据集中,我从0.0039降到了0.0037。我也将应用您提出的索引解决方案,看看它是如何运行的。我不认为这是瓶颈:-(非常繁忙的生产服务器的操作模式与测试服务器完全不同。
 CURDATE()-INTERVAL DAYOFWEEK(CURDATE())-1 DAY
    cs.call_start >= CURDATE()-INTERVAL DAYOFWEEK(CURDATE())-1 DAY
AND cs.call_start <  CURDATE()-INTERVAL DAYOFWEEK(CURDATE())-1 DAY + INTERVAL 7 DAY
GROUP BY DATE(call_start)-INTERVAL DAYOFWEEK(DATE(call_start))-1 DAY