Php Mysql CPU 100%-无慢速查询
我有一个通过vpn调用mysql数据库的web应用程序 有时(当许多客户使用该系统时),来自远程mysql主机的cpu达到100%,而一切都变得非常缓慢(我甚至收到错误500) 我打开了慢速查询日志,里面什么都没有 我看到了processlist,有一些查询(大约30个,这是正常的,因为我使用了很多ajax),它们对数据进行排序 执行此操作的查询是(填写数字): 我在数据库的本地副本上运行上述操作,执行时间为0.0027 我去掉了时差和排序,执行时间差很小 在GoogleChrome上,我看到ajax响应有时超过30秒 db服务器的任务管理器显示主要负载是mysql.exe 你们有没有线索可以帮我解决这个问题 你认为是查询还是服务器的问题 更新 Ajax呼叫每天下午最多等待30秒!! 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
如果您有任何想法,我将不胜感激。由于本条款的存在,您的
左连接
被迫成为内部连接
:
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代码有关
更清楚地说:
- 每个呼叫室都有多个呼叫舱
- 我正在创建一个连接,并为每个客舱执行一个查询
谢谢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