2017-05-22 63 views
1

在SO bot中也存在類似的問題,這不是我想知道的。MySql性能,從FROM_UNIXTIME vs PHP解析到日期字符串

我有一個INSERT語句看起來像這樣:

insert into my_table (id, time) values 
(1, from_unixtime(1495488539)), 
(2, from_unixtime(1495488539)), 
... 
(99, from_unixtime(1495488539)), 
(100, from_unixtime(1495488539)); 

,這是獲得時間戳與PHP的,像這樣:$time = time()

它看起來像這個函數將被執行插入的每一行,它聽起來效率低下。

我的另一種選擇是產生在PHP這樣的時候:$time = date('Y-m-d H:i:s')和我的插入語句如下所示:

insert into my_table (id, time) values 
(1, '2017-05-22 21:28:59'), 
(2, '2017-05-22 21:28:59'), 
... 
(99, '2017-05-22 21:28:59'), 
(100, '2017-05-22 21:28:59'); 

那一個,因爲有每行沒有函數調用看起來簡單,但MySQL的仍然每次解析字符串,對吧?

問題是我應該使用哪種口味纔能有更好的表現?

爲什麼我不簡單地使用current_timestampnow()?因爲所有行的日期必須相同,並且我不做一個單獨的插入,我將它分佈在許多不同的小插入語句中,所以實際上我的php看起來更像$time = $global_time_same_for_all_rows_not_exactly_now。換句話說,那段時間被認爲有點像某種進口鑰匙。

+0

你的第一個查詢是爲每一行調用'from_unixtime(1495488539)',這顯然比簡單插入一個字符串要慢。但是,除非要插入數十萬個值,否則這種差異可以忽略不計。 –

+0

只是一個說明,但如果你的MySQL服務器和PHP服務器之間存在時區差異,我相信你的mysql from_unixtime(timestamp value)和php date函數可能會產生不同的結果。這就是說,它看起來像你正在使用日期時間字段,所以只是傳遞日期字符串可能更簡單。 – georaldc

+0

@georaldc是否重要?不是php的'time()'函數在全世界都應該是絕對的輸出嗎?除非我誤解了,那麼當你將它解析爲考慮時區的可讀日期時,對嗎? –

回答

1

將日期()分配給$ time,然後在多個插入語句中重複使用該變量將會減少開銷。

在php中使用time()然後在mysql中使用from_unixtime將其轉換回日期時間是一個額外的不必要的步驟。

1

這一個是可能優化:

insert into my_table (id, time) values 
    (1, NOW()), 
    (2, NOW()), ...; 

這是因爲某些函數聲明之前特意計算一次 - 現在,UNIX_TIMESTAMP,UUID?和其他幾個人,但不RAND 。

但是,所有這些大多是無關緊要的。執行行插入(或選擇等)的開銷遠遠超過執行from_unixtime(1495488539)或幾乎任何其他簡單函數所花費的微不足道的時間。這可能是毫秒與亞微秒時間之間的差異。

+0

謝謝,這是我在我的「簡陋」的測試已經看到了,但我不能得出一個結論,這有助於。 –