我有一个存档表,其中仅存储对记录的更改以及有效日期。一个例子是产品的价格文件。
如果您现在想要选择给定日期的状态,我有以下选择。 问题是,更改越多,速度就越慢,因为在第一步中,数据库首先读取所有记录,然后在下一步中附加那些具有更大有效日期的记录。最后,只有有效期最长的保留在最左边。
有什么办法可以让这个更有效吗?
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 JOIN
和 NOT 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/