MySQL:如何加速归档表

标签 mysql query-optimization

我有一个存档表,其中仅存储对记录的更改以及有效日期。一个例子是产品的价格文件。

如果您现在想要选择给定日期的状态,我有以下选择。 问题是,更改越多,速度就越慢,因为在第一步中,数据库首先读取所有记录,然后在下一步中附加那些具有更大有效日期的记录。最后,只有有效期最长的保留在最左边。

有什么办法可以让这个更有效吗?

SELECT d1.*
FROM data d1
LEFT JOIN data d2 
   ON d1.id = d2.id AND 
      d1.valid_from_date < d2.valid_from_date
WHERE 
   d2.id IS NULL AND 
   d1.valid_from_date <= '2023-01-01';

CREATE TABLE data (
    id int,
    valid_from_date DATE,
    foo varchar(255),
    bar varchar(255),
    PRIMARY KEY (id, valid_from_date)
);

最佳答案

您可以尝试使用 NOT EXISTS 代替 LEFT JOINNOT NULL 条件,例如:

SELECT d1.*
FROM data d1
WHERE 
   d1.valid_from_date <= '2023-01-01' AND
   NOT EXISTS (
     SELECT 1 
     FROM data d2 
     WHERE d1.id = d2.id AND 
        d1.valid_from_date < d2.valid_from_date
   );

关于MySQL:如何加速归档表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76898518/

相关文章:

mysql - 如何删除特定行的外键?数据库

php - MySQL:向表中插入多行数据,一些数据来自另一个表(关系型)

MySQL - 添加总计行和列的最简单方法

mysql - 优化 MySQL 查询,避免不必要的用户自定义函数调用

mysql - 如果涉及的表之一没有定义索引,mysql查询运行速度会变慢吗?

php - 有什么办法可以优化这个mysql查询吗?

php - 这种到 PDO 的转换是否正确?

PHP - 如何从 MySQL 查询中获取所有行

python - 大量属性的单独数据存储查询顺序

postgresql - 向后索引扫描与索引扫描