2014-11-04 46 views
0

智能如何使用日期作爲主值而不是ID?改爲在mysql數據庫中使用日期ID

我在哪裏可以得到更好的搜索mysql數據庫服務表現:

to use timestamp: 1394319600 
or to format date and use it as: 09032014 

09032014 = 1394319600 = 9.Mart 2014

+0

'PRIMARY'字段AFAIK是一個唯一的字段,如果它嘗試插入相同的值,則必須處理併發插入。 – Prix 2014-11-04 16:10:14

+0

我只是問becouse 1394319600是一個很大的數字,這將如何影響搜索 – 2014-11-04 16:14:58

+0

這個問題不在搜索中。查詢小號ID和大號ID是絕對沒有什麼區別的。但是如果兩個參賽作品有相同的日期,你會怎麼做? – JJJ 2014-11-04 16:20:49

回答

2

你可能不應該使用數據字段作爲主鍵爲datetime型首先。我會建議使用autoincrementing整數字段來保證唯一性。

現在關於datetime/timestamp字段本身,對於這些列使用本地日期時間或時間戳數據類型幾乎總是更好,而不是字符串表示,例如unix時間戳或其他格式化的日期字符串。

爲什麼?因爲當人們將時間戳數據放入其數據庫庫中時,他們通常會希望對該數據運行查詢。如果您將數據以非本地日期時間格式存儲,則通常需要將其轉換爲此類格式,然後才能在用於此類查詢的典型日期/時間函數中使用它。這通常意味着您無法利用該字段上的任何索引進行查詢。

例如,假設您想運行查詢以查看當天的所有記錄。使用Unix時間戳字段,查詢可能看起來像:

SELECT * FROM table 
WHERE FROM_UNIX_TIMESTAMP(timestamp_field) 
    BETWEEN CONCAT(CURRENT_DATE(), ' 00:00:00') AND CONCAT(CURRENT_DATE(), ' 23:59:59') 

而有日期時間/時間戳提起它會是什麼樣子:

SELECT * FROM table 
WHERE timestamp_field 
    BETWEEN CONCAT(CURRENT_DATE(), ' 00:00:00') AND CONCAT(CURRENT_DATE(), ' 23:59:59') 

這裏簡單要求上的左側使用FROM_UNIX_TIMESTAMP()如果第一個查詢中的條件阻止使用索引,因爲FROM_UNIX_TIMESTAMP(timestamp_field)在內存中不存在,例如timestamp_field會正確編入索引。這意味着您現在需要執行全表掃描來執行該查詢。如果你有一個大桌子,這可能是非常有問題的。

+0

我只問問becouse 1394319600是一個很大的數字,這將如何影響搜索...如果是ID(0-1000),而不是1394319600 ...... Probaly搜索會更快? – 2014-11-04 16:17:02

+0

@JamesD。看到我添加的筆記關於爲什麼你應該使用本地日期時間字段。實際上,如果對該字段的查詢(如果與正確的索引一起正確地完成)通常會比爲了使查詢工作而需要執行任何類型的數據轉換時好得多。 – 2014-11-04 16:21:39

+0

否否,數據庫中的日期將不是日期格式,其數字格式爲 – 2014-11-04 16:23:34

相關問題