通过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秒,这是一个巨大的进步。投票通过并被接受。