在SO机器人中有类似的问题并不是我想知道的。
我有一个看起来像这样的插入语句:
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_timestamp
或now()
?因为所有行的日期必须相同,而且我不进行单个插入,我将它分散在许多不同的较小插入语句中,所以实际上我的php看起来更像$time = $global_time_same_for_all_rows_not_exactly_now
。换句话说,该时间被视为某种类型的导入键。
答案 0 :(得分:1)
将date()分配给$ time,然后在多个insert语句中重复使用该变量将减少开销。
在php中使用time()然后在mysql中使用from_unixtime转换回日期时间是另外一个不必要的步骤。
答案 1 :(得分:1)
这个可能是优化的:
insert into my_table (id, time) values
(1, NOW()),
(2, NOW()), ...;
这是因为某些函数在语句之前被故意评估过一次 - NOW,UNIX_TIMESTAMP,UUID?和其他几个,但不是RAND。
但是,所有这些都是无关紧要的。执行行插入(或选择等)的开销远远超过执行from_unixtime(1495488539)
或几乎任何其他简单函数所需的微不足道的时间。这可能是毫秒与亚微秒时间之间的差异。