我有以下存储过程:
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 的最便宜价格,然后在 Cheapest 列中更新该价格。这样我就可以快速查找每个表演者和 field 的最低价格。
大约有 20,000 名个人表演者,以及类似数量的 field 。
感谢您的帮助。
最佳答案
您的基本问题是,您正在运行查询来再次查找每行的最低价格,这是非常低效的。
如果将两个查询合并为一个查询。它将执行得更快:
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)
(或至少这些列的某些子集)上有一个复合索引。
关于mysql - 通过 MySQL 存储过程和函数更新 180k 行太慢 - 如何加快速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29719180/