【问题标题】:Optimize speed of query which compares values of two different time-stamps优化比较两个不同时间戳值的查询速度
【发布时间】:2020-09-03 18:35:57
【问题描述】:

DB-Fiddle

CREATE TABLE operations (
    id int auto_increment primary key,
    time_stamp DATE,
    product VARCHAR(255)
);

INSERT INTO operations
(time_stamp, product)
VALUES 
("2020-01-01", "Product_A"),
("2020-01-01", "Product_B"),
("2020-01-01", "Product_C"),
("2020-01-01", "Product_D"),

("2020-03-15", "Product_A"),
("2020-03-15", "Product_C"),
("2020-03-15", "Product_E");

查询:

SELECT 
time_stamp,
product,

 (CASE 
 WHEN MAX(time_stamp) OVER (PARTITION BY product) 
    = MIN(time_stamp) OVER () THEN 'deleted'
 WHEN MIN(time_stamp) OVER (PARTITION BY product) 
    = MAX(time_stamp) OVER () THEN 'new'
 ELSE 'both' END) AS existing_type
 
FROM operations
GROUP BY time_stamp, product
ORDER BY product, time_stamp;

如果产品存在于both time-stamps 中,则使用上述查询我会检查表。
如果它仅存在于其中一个中,则将其分配给deletednew
该查询在示例中运行快速且完美。

但是,当我将它应用到包含更多数据的原始数据库时,它的执行速度非常慢。
因此,我想知道是否有办法优化查询以使其在大量数据上也能快速运行?

【问题讨论】:

  • 您的大表中是否只有 2 个时间戳值?
  • 请再添加几行——包括一些“两种”情况。并指出“正确”的结果集。

标签: mysql sql query-optimization


【解决方案1】:

您提供的数据中没有重复的 timestamp/product 对。这表明聚合是多余的:

SELECT time_stamp, product,
       (CASE WHEN MAX(time_stamp) OVER (PARTITION BY product) = MIN(time_stamp) OVER () THEN 'deleted'
             WHEN MIN(time_stamp) OVER (PARTITION BY product) = MAX(time_stamp) OVER () THEN 'new'
             ELSE 'both'
        END) AS existing_type 
FROM operations
ORDER BY 2, 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2012-02-04
    • 2016-08-06
    • 1970-01-01
    • 2015-01-02
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多