mysql - 通过 MySQL 存储过程和函数更新 180k 行太慢 - 如何加快速度

标签 mysql function stored-procedures query-optimization

我有以下存储过程:

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 分钟,我正在寻找加快速度的方法。

下图显示了数据示例:SQL data example

存储过程背后的想法是找到相同 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/

相关文章:

php - 拉维尔 5.1 : how to fetch on separate table

java - 什么都不接受也不返回什么的函数式接口(interface)

mysql - 管理 MySQL 存储过程中返回的内容

sql-server - 非常简单的存储过程会超时

php - 如何使用一个存储过程从单独的表中返回 mysql 列?

mysql - 用户组表架构

php - 在php中转换unix时间

mysql - mysql中select命令的奇怪问题

jquery - 嵌套函数按顺序运行

r - 在单个 R 函数中将 '. . .' 用于两个目的