2011-03-28 65 views
4

各種方法之間的性能對比現在有,我在我的腦海三個選項。存放在MySQL日期:爲日期

- >四列(日,月,年,日)=> 28,03,2011年1 我可以輕鬆地搜索和修改這些列沒有MySQL的日期額外的學習。

第二 - >一個日期欄(DD-MM-YYYY)=> 28-03-2011 這僅需要一列,更容易管理,因爲這裏僅有一個WHERE用於搜索日期參數。但我不知道如何在特定的日子裏搜索所有記錄。可以表示過去所有星期一的所有數據或所有28日的所有數據。

- >兩列(Unix時間戳今天的日期,天)=> 1827328721,1 現在,我在這裏可以存儲數據存儲爲一個時間戳,容易做的搜索和比較,通過簡單的獲取日期然後把它變成一個unix時間戳,然後在sql中使用它。一天我可以使用日欄。

現在問題是:

  1. 如何表現這些方法之間有什麼不同?
  2. 將如何進行選擇,插入和更新查詢來構建這些不同提議的解決方案?
  3. 哪一個最適合您的觀點?爲什麼?

請仔細回答所有的三個問題。因爲我在其他地方找不到這些信息,而且我知道堆棧溢出具有出色的程序員,他們可以非常連貫地回答這個問題。這個問題不僅會使像我這樣的新手受益,還會想到其他所有可以用來作爲參考的新手。

感謝提前堆棧溢出社區。

回答

5

如何表現這些方法之間有什麼不同?

這變化在很大程度上取決於什麼類型的應用程序使用的數據庫。

第一種方法可以被認爲是一個非規範化的方法,但如果數據用於OLAP應用程序,這可能是一個好主意。例如,如果您經常需要在一個月中的某個特定日期收集大量數據,那麼這種去標準化可能是合理的,否則,這隻會​​浪費存儲空間並且不必要的複雜。

與第三個選項一樣......它只是日期的非標準化表示;這可能是非常有限的用途,但通常這是一個壞主意。

- 編輯 -

通過非歸,我指的是以下...

比方說,你有以下字段的記錄...

Date  Day Month Year 
3/28/2011 28  3  2011 

而且可以說你需要改變從28日到29日的那一天。在這種情況下,您需要更新兩個字段,日期和日期字段...而不是一個。如果你總是記得更新兩者,那麼這不是一個大問題。但如果你不這樣做,隨着時間的推移,你會得到如下的結果。

Date  Day Month Year 
3/28/2011 29  2  2009 

那麼實際日期是多少?通過將信息存儲在一個地方,可以消除數據不一致的可能性。

- END EDIT--

哪一個是最好的在你看來,爲什麼?

除非您的數據庫用於OLAP ...我會考慮第二個選項是最好的。

如何會爲選擇,插入和更新查詢中 構建這些不同 提出的解決方案?

對於首選,第二個選項,這是微不足道的。

- 第二個編輯 -

您可以在日期作爲字符串傳遞,和MySQL將根據解析它。日期格式爲「YYYY-MM-DD HH:mm:SS」,但是如果不關心存儲時間,則不必指定時間。

INSERT INTO tablename (date) VALUES ('2011-3-28') 

或者,如果你只是想添加當前日期...

INSERT INTO tablename (date) VALUES (CURDATE()) 

- 編輯完 -

+0

偉大的答案有...謝謝...我有的應用程序是一個小部件,顯示一些元素。記錄每個元素的印象,從而產生插入。所以如果在小部件中有500個元素是500個插入...那麼查看今天,過去幾天的統計數據,以及按照需求的其他隨機日期。你會說這是一個OLAP應用程序。出於某種原因,我找到了第一種方式,不需要太複雜,因爲對於插入,您只需指定日期,月份和年份的三個參數;搜索是一樣的。你能否解釋爲什麼這是非規範化的。 – Vish 2011-03-28 20:52:47

+0

從您的描述來看,您的應用程序聽起來更像OLTP而不是OLAP應用程序......我認爲典型的OLAP應用程序至少要處理數百萬行數據。至於第一種方式......我認爲它是非規範化的,因爲同一條信息(日期)在多個字段中被複制......月份,年份和日期字段都已經在日期列中表示。如果您需要修改日期,則需要在多個地方修改數據以保持一致。 – 2011-03-28 20:55:42

+0

它目前有大約300,000條記錄,每秒約1200個插入/更新,每秒500個選擇。 – Vish 2011-03-28 21:11:08

4

如果您需要存儲日期值,date(或datetime)類型是您的選擇。 Mysql有很多幫助你構建查詢的datetime functions。例如,

SELECT * FROM your_table 
WHERE date_column < DATE(NOW()) AND DAYOFWEEK(date_column) = 2 

//過去

+0

它。對不起,沒有看到它。 – wallyk 2011-03-28 19:47:47

+0

你能回答這個問題的表現嗎,這是至關重要的!謝謝:) – Vish 2011-03-28 20:54:42

+0

性能取決於索引以及它們如何對應於查詢。如果你在'date'列創建了一個索引,那麼一旦mysql引擎決定查詢可以從使用索引中受益,它就會使用它。如果您爲一週中的某一天或某一天中的某個日期創建了單獨的列,並且該列上的索引不存在,則該索引不會有足夠的選擇性,無法被優化程序考慮。 – a1ex07 2011-03-28 21:56:06

1
  1. 唯一有用的所有星期一,如果你需要獨立的 部分,這是 可能性不大。
  2. 日期或日期時間是本地,你可以讓他們的索引,以加快。
  3. 不好,不是mysql本地的。如果你需要分辨率到秒,然後使用日期時間。

有關日期和日期時間操作的更多信息看一下說明書。

+0

不能索引我指定的四列。 – Vish 2011-03-28 20:55:05