我是一名贸易网页设计师,因此对任何缺乏知识表示歉意,并感谢任何可以提供的参考资料。
在这种情况下,我们公司有一系列我们在内部使用的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使用情况的屏幕截图。
答案 0 :(得分:0)
你正在使用DESC排序,MySQL不支持索引,在v.5.6中。
似乎繁重的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,看看执行计划中有多少文件操作。