2011-09-08 24 views
0

私は将来的にウェブサイトに掲載する必要があるコンテンツがたくさんあります。時間が来たときにそれを公開する最も効率的な方法は何ですか?ウェブサイト上でコンテンツをスケジュールする最も効率的な方法

現在の実装は、2つのdatetime列:online_atoffline_atです。 online_atoffline_at列の索引を

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

コンテンツを取得するためのSQLクエリは次のようになります。それはうまく動作し、明白なパフォーマンスのペナルティはありませんが、私はまだこれについて行くより効率的な方法があるかどうか疑問に思っています。索引を1つのより単純な列にする方法はありますか(高価な日時ではありません)。

+0

online_atとoffline_atの列 –

+0

は、質問に記載されているようにdatetime列です。 online_atには、コンテンツがオンラインに表示される日時が含まれ、offline_atにはコンテンツが再び消える日時が含まれます。 offline_atはNULLでもかまいません。この場合、コンテンツは決して消えません。 –

+0

実行計画はどのように見えますか? –

答えて

1

私はあなたの工事を何度も見てきましたが、何百万行もの打撃を受けると非常に遅くなるのを目の当たりにしていましたので、本当に建設について心配する必要はありません。

ことの一つは、私は自分自身を試していないが、それはあなたが並列処理を増加与えることができること、(あなたのDBに応じて)online_atoffline_at、その後EXCEPT/MINUSを使用して別々のインデックスを持つことです。本質的にはIDだけを使用しますが、これは明らかに日付以外のフィールドリスト全体で拡張できます。つまり、

SELECT id, header, text, ... 
    FROM CONTENT 
WHERE online_at < current_timestamp 
MINUS 
SELECT id, header, text, ... 
    FROM CONTENT 
WHERE offline_at < current_timestamp 
+1

これは実際には非常にスマートなクエリです。問題が発生したときに試すもののようです。現時点では、それは過度のようだと私は喜んで元のクエリはちょうど良いことをあなたの観察を受け入れる。 –

0

また、私はオフラインがnullまたはし、デフォルトしないことを保証することを示唆しているあなたは、あなたが使用しているデータベース述べるませんでしたが、あなたはMySQLを使用している場合は、あなたの列のタイムスタンプが唯一の4つのバイトを使用します作っ対8

ヌルを許可します。永続日付を使用します(将来デフォルトの日付)。テーブル定義を変更し、これをデフォルトの日付として設定することができます。日付が「2037-12-31」であるタイムスタンプの場合日時の場合は '9999-12-31'です。

今これはおそらく、ほとんどありませんいくつかの点で大規模なデータベース、になるだろうされていない限り、行当たり8つのバイトを保存すると、契約の大きなではありませんが、あなたが尋ねた;)

これがない場合にはmysqlの質問、私に知らせてくださいと私はこの答えを削除します。そうであれば、再タグ付けするかもしれません。

またこれらの列がでていないようNOW()あなたはそれを見て必要性を排除したいonline_atと

offline_atしかし、再びとの間には、NULL IS SELECT ...するクエリを書き直すことができますインデックス。

+0

あなたの答えをありがとう。私は実際に、さまざまなシステムでこのテクニックを使用しています:MySQL、PostgreSQL、SQLite個人的には、9999-12-31のようなダミーの日付を使用して不足している価値を示すファンではありません。私の意見では、この例のoffline_atのように、何かが欠落しているときにNULLを使用するとよいでしょう。 –

+0

@Joost:私はあなたが非論理的であるというあなたの権利を尊重します;)あなたのシステムoffline_atがIS NULLであっても、値が欠落しているわけではありません。オフラインの行がない場合は、結果セットにIS NULLが表示されます。実際には、記事に「有効期限がありません」ということを示すために使用しています。あなたが質問したように---これはoffline_atでのインデックスの使用を効果的に排除し、物事を遅くし、一般的にアプリケーションのポータビリティを低下させます。なぜなら、NULLは一般に問題があり回避されるからです。 ORを追加すると、DBがより多くの作業を行うように強制されていることが示されます。 – gview

+0

あなたはポイントがありますが、データベースの上にあるアプリケーションではNULLが簡単に処理されます。だから私の場合、私はあまり心配していません。私が保存したい実際の値はNULLではありませんが、それは「まったく」のようなものです。しかし、私はそれがSQL仕様にないことは確かです。 :) –

関連する問題