2

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

情况就是这样,我们公司有一系列我们在内部使用的 webapps,它们是用 PHP 和 MySQL 构建的。我们将它们托管在 hostgator 专用服务器(4 核 4GB RAM)上。

最近,管理层希望将服务器搬到离家更近的地方(英国),我们决定购买 Heart Internet混合服务器(12 核和 28GB RAM)。

传输已经完成,我们肯定可以看到静态页面和简单查询页面的速度有了很大的提高。

但是,每当尝试访问迭代大量记录(从 10,000 条以上)的页面时,该页面只会加载和加载......在 WHM 中,我们可以在“当前进程”下看到服务器 CPU 失控,从 20% 的低位开始,一直增加到 200%+!

我知道查询的设计并不出色(内部选择使用不当等)我试图在某些情况下通过更好的索引使用来纠正这个问题,并且在某些情况下这提高了性能。但是,由于 Web 应用程序如此庞大,重写糟糕的 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 使用率截图。

高 CPU 使用率

4

1 回答 1

0

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

13.1.11。创建索引语法

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

8.13.15。DISTINCT 优化

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

所以查询应该是这样的:

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;

你可以看一个现场演示,看看执行计划中有多少文件排序操作。

于 2013-03-16T21:05:50.277 回答