通过MySQL存储过程更新180k行&;功能太慢-如何加速
我有以下存储过程:通过MySQL存储过程更新180k行&;功能太慢-如何加速,mysql,function,stored-procedures,query-optimization,Mysql,Function,Stored Procedures,Query Optimization,我有以下存储过程: CREATE DEFINER=`ST`@`%` PROCEDURE `CalculateCheapestPriceALL`() BEGIN UPDATE tickets SET tickets.Cheapest = GetCheapestTicket(tickets.STPerformerID, tickets.STVenueID, tickets.FeedID); E
CREATE DEFINER=`ST`@`%` PROCEDURE `CalculateCheapestPriceALL`()
BEGIN
UPDATE
tickets
SET
tickets.Cheapest = GetCheapestTicket(tickets.STPerformerID, tickets.STVenueID, tickets.FeedID);
END
GetCheapestTicket功能如下所示:
CREATE DEFINER=`suprtickets`@`%` FUNCTION `GetCheapestTicket`(performerID INT(11), venueID INT(11), feedID INT(11)) RETURNS decimal(10,2)
BEGIN
DECLARE TicketPrice DECIMAL(10,2);
SET TicketPrice =
IFNULL((
SELECT
MIN(tickets.Price)
FROM
tickets
WHERE
tickets.STPerformerID = performerID
AND
tickets.STVenueID = venueID
AND
tickets.FeedID = feedID
AND
tickets.Price > 0
),0);
RETURN TicketPrice;
END
运行存储过程目前大约需要10分钟,我正在寻找加快速度的方法
下图显示了数据示例:
存储过程背后的思想是为相同的STPerformerID和STVenueID找到最便宜的价格,然后在最便宜的列中更新它。这样我就可以很快地找到每一个场地的最低价格
大约有2万名个人表演者,场馆数量也差不多
谢谢您的帮助。您的基本问题是,您正在运行查询,以重新查找每行的最低价格,这是非常低效的 如果将两个查询合并为一个查询。它的执行速度将大大加快:
UPDATE tickets AS t1
JOIN (SELECT STPerformerID, STVenueID, STFeedID, MIN(Price) AS cheapest
FROM tickets
WHERE Price > 0
GROUP BY STPerformerID, STVenueID, STFeedID) AS t2
USING (STPerformerID, STVenueID, STFeedID)
SET t1.Price = t2.cheapest
要使其性能良好,请确保在
(STPerformerID、STVenueID、STFeedID)
(或至少是这些列的某些子集)上有一个复合索引。!那很好用。只需运行它,大约需要15秒,这是一个巨大的进步。投票通过并被接受。