我有很多内容需要在将来的某个时间在网站上发布。什么时候发布它的最有效方式是什么?
我目前的实施是两个日期时间列:online_at
和offline_at
。
获取内容的sql查询如下所示:
SELECT *
FROM contents
WHERE online_at > current_timestamp
AND (offline_at IS NULL OR
offline_at < current_timestamp);
的索引超过online_at
和offline_at
列。它运作良好,没有明显的性能损失,但我仍然想知道是否有更有效的方法来解决这个问题。有没有办法将索引减少到一个更简单的列(不是日期时间,这似乎很昂贵)?
答案 0 :(得分:1)
我已经多次看到你的构造,我只看到它在撞到数百万行时变得非常慢,所以我不确定你是否真的应该担心这种结构。
有一件事,我没有尝试过自己,但这可能会增加并行性,就是在online_at
和offline_at
上使用单独的索引,然后使用EXCEPT
/ {{ 1}}(取决于您的数据库)。本质上只使用ID,但显然可以使用除日期之外的整个字段列表进行扩展。即:
MINUS
答案 1 :(得分:0)
您没有说明您正在使用哪个数据库,但如果您使用的是mysql,那么使您的列时间戳只会使用4个字节而不是8个。
另外我建议确保offline不会默认为NULL或允许NULL。使用永久日期(将来的某个日期作为默认日期)。您可以更改表定义并将其设置为默认日期。对于日期为'2037-12-31'的时间戳。对于日期时间,它是'9999-12-31'。
现在除非这在某个时刻成为一个大型数据库,这可能不太可能,每行节省8个字节并不是什么大不了的事,但是你问;)
如果这不是一个mysql问题,请告诉我,我将删除此答案。如果是,你可能会重拍。
您也可以重写查询 SELECT ...其中NOW()在online_at和offline_at
之间但是你又想要消除它看待IS NULL的要求,因为这些列不在索引中。