在网站上安排内容的最有效方式

时间:2011-09-08 21:21:38

标签: sql

我有很多内容需要在将来的某个时间在网站上发布。什么时候发布它的最有效方式是什么?

我目前的实施是两个日期时间列:online_atoffline_at

获取内容的sql查询如下所示:

SELECT * 
  FROM contents 
 WHERE online_at > current_timestamp 
   AND (offline_at IS NULL OR 
        offline_at < current_timestamp);

的索引超过online_atoffline_at列。它运作良好,没有明显的性能损失,但我仍然想知道是否有更有效的方法来解决这个问题。有没有办法将索引减少到一个更简单的列(不是日期时间,这似乎很昂贵)?

2 个答案:

答案 0 :(得分:1)

我已经多次看到你的构造,我只看到它在撞到数百万行时变得非常慢,所以我不确定你是否真的应该担心这种结构。

有一件事,我没有尝试过自己,但这可能会增加并行性,就是在online_atoffline_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的要求,因为这些列不在索引中。