2011-09-08 16 views
0

我有很多內容需要在未來某個時間在網站上發佈。到時候發佈它的最有效方式是什麼?在網站上安排內容的最有效方式

我目前的實施是在兩個日期時間列: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列的索引。它運行良好,並且沒有明顯的性能損失,但我仍然想知道是否有更有效的方法來解決這個問題。有沒有辦法將索引減少到一個更簡單的列(而不是日期時間,這看起來很昂貴)?

+0

請解釋online_at和offline_at列 –

+0

它們是日期時間列,如問題中所述。 online_at包含內容應該在線顯示的日期時間,offline_at包含內容應該再次消失的日期時間。 offline_at也可以是NULL,在這種情況下內容不會消失。 –

+0

你的執行計劃是什麼樣子的? –

回答

1

我已經看到過你的建築很多次了,而且我只看到它在撞擊數百萬行時變得過於緩慢,所以我不確定你應該真的擔心建築。

有一兩件事,我沒有嘗試過自己,但可以給你增加並行,是有獨立的索引上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

您沒有說明您所使用的數據庫,但如果你正在使用MySQL,讓您的列時間戳將只能使用4個字節VS 8.

此外,我會建議離線確保不會默認設置爲NULL或允許爲空。使用永久日期(將來某個日期作爲默認日期)。您可以更改表格定義並將其設置爲默認日期。對於日期爲'2037-12-31'的時間戳。對於日期時間,它是'9999-12-31'。

現在,除非這將是在某一時刻的大型數據庫,這可能是不可能的,節省每行8個字節是不是什麼大不了的事,但你問;)

如果不是一個MySQL的問題,請讓我知道,我會刪除這個答案。如果是,你可能會重新登錄。

您也可以重寫查詢是 online_at offline_at

之間的選擇......在那裏NOW()但同樣要消除它看要求,因爲這些列不在IS NULL指數。

+0

感謝您的回答。我實際上在各種系統上使用這種技術:MySQL,PostgreSQL和SQLite。就個人而言,我不喜歡使用9999-12-31這樣的虛擬日期來表示缺失的值。在我看來,當缺少某些東西時,NULL是一個很好的值,就像例子中的offline_at一樣。 –

+0

@Joost:我尊重你不合邏輯的權利;)在你的系統中offline_at IS NULL並不意味着缺失值。如果沒有離線的行,IS NULL將出現在結果集中。您實際上正在使用它們來指示文章「沒有過期日期」。既然你問---這有效地消除了在offline_at上使用索引,使事情變得更慢,並且通常使得應用程序的移植性降低,因爲NULL通常是有問題的並且要避免。不得不添加OR應該是向你表明你正在迫使db做更多的工作。 – gview

+0

你確實有一點,但是在數據庫頂部的應用程序中,很容易處理NULL。所以對我而言,我並不太擔心。雖然我非常同意我想存儲的實際值不是NULL,但它是「永遠」或類似的東西。但我很確定這不在SQL規範中。 :) –

相關問題