运行复杂的SQL时,服务器CPU百分比非常高

时间:2013-03-16 20:51:14

标签: php mysql performance

我是一名贸易网页设计师,因此对任何缺乏知识表示歉意,并感谢任何可以提供的参考资料。

在这种情况下,我们公司有一系列我们在内部使用的Web应用程序,用PHP和PHP构建。 MySQL的。我们将它们托管在hostgator专用服务器上(4核心4GB RAM)。

最近,管理层希望将服务器移到离家较近的地方(英国),我们决定使用Heart Internet Hybrid Server(12核和28GB RAM)。

传输已经完成,我们绝对可以看到静态页面的速度有很大提高,只需查询页面。

然而,每当试图访问迭代大量记录(10,000以上的任何内容)的页面时,页面就会加载并加载....而在WHM中,我们可以在“当前进程”中看到&#39 ;服务器CPU螺旋式失控,从低20%开始一直上升到200%+!

我知道查询设计不是很出色(内部选择使用得很糟糕等)我试图在某些情况下纠正这种情况,使用更好的索引,在某些情况下,这提高了性能。但是,由于webapps太大,重写错误的SQL并以这种方式提高性能需要很长时间。

我怀疑这很可能是服务器配置错误,因为查询确实可以在我们以前的服务器上运行,但速度有点慢。另一个可能的原因是某种缓存是在以前的服务器上构建的,但不在新服务器上,因此自然需要一些时间来创建'。

下面是一个挂在新服务器上但没有挂在旧服务器上的查询示例(只花了大约4/5秒)。

SELECT DISTINCT o.order_number, o.customer_id, o.order_date, CONCAT( cd.customer_fname,  ' ', customer_lname ) AS CustomerName, (

SELECT status_id
FROM Order_Tracking
WHERE order_id = o.id
ORDER BY id DESC 
LIMIT 1
)CurrState
FROM Orders o, Customer_Details cd
WHERE o.customer_id = cd.id
AND (

SELECT status_id
FROM Order_Tracking
WHERE order_id = o.id
ORDER BY id DESC 
LIMIT 1
) =1
ORDER BY o.order_number

下面是浏览到页面后5分钟CPU使用情况的屏幕截图。

High CPU Usage

1 个答案:

答案 0 :(得分:0)

你正在使用DESC排序,MySQL不支持索引,在v.5.6中。

13.1.11. CREATE INDEX Syntax

似乎繁重的DISTINCT操作需要一个临时表。

8.13.15. DISTINCT Optimization

因此,这是与服务器配置无关的查询和模式优化问题。

所以查询应该如下所示:

SELECT 
  Orders.order_number,
  Orders.customer_id,
  Orders.order_date,
  CONCAT(Customer_Details.customer_fname,  ' ', Customer_Details.customer_lname) AS CustomerName, 
  status_id AS CurrState
FROM Orders 
INNER JOIN Customer_Details
ON(Orders.customer_id = Customer_Details.id)
INNER JOIN Order_Tracking
ON(Orders.id = Order_Tracking.order_id)
INNER JOIN (SELECT order_id, MAX(id) id FROM Order_Tracking GROUP BY order_id) LastOrderTracking
ON (Order_Tracking.id = LastOrderTracking.id)
WHERE status_id = 1
ORDER BY Orders.order_number;

您可以查看实时demo,看看执行计划中有多少文件操作。