2017-05-22 33 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

谢谢,这是我在我的“简陋”的测试已经看到了,但我不能得出一个结论,这有助于。 –