UNIX_TIMESTAMP() рассчитывается один раз для больших запросов на вставку?
Я сделал тест. Вот таблица innodb:
CREATE TABLE `test_UNIX_TIMESTAMP` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`datefrom` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
Вот вставка:
insert into test_UNIX_TIMESTAMP (datefrom) values
(UNIX_TIMESTAMP())
,(UNIX_TIMESTAMP())
,(UNIX_TIMESTAMP())
....many many
,(UNIX_TIMESTAMP());
Вот запрос, чтобы проверить это уникальные метки времени или нет:
select distinct(datefrom) from test_UNIX_TIMESTAMP;
Результаты:
After Affected rows: 106 400, we have 1 unique timestamp value in the table.
After Affected rows: 1 170 400 , we still have 1 unique timestamp value in the table.
MySQL сервер - это удаленный SQL-сервер (xeon 1270v3 с 32 оперативной памятью, mysql имеет 4Gb кеш).
Является ли значение "UNIX_TIMESTAMP()" фиксированным для больших запросов вставки? Или это исправлено для сессии? Или мне просто везет?
2 ответа
Документация MySQL не ясна по этому вопросу. Тем не менее, он проводит различие между CURRENT_TIMESTAMP()
(или же NOW()
) а также SYSDATE()
- первое вычисляется один раз за запрос, а второе - при каждом вызове (и, вероятно, немного медленнее).
Вы можете продемонстрировать это сами, позвонив обеим сторонам SLEEP
инструкция:
mysql> select NOW() "a", SYSDATE() "b", SLEEP(2) "_", NOW() "c", SYSDATE() "d";
+---------------------+---------------------+---+---------------------+---------------------+
| a | b | _ | c | d |
+---------------------+---------------------+---+---------------------+---------------------+
| 2015-11-04 11:18:55 | 2015-11-04 11:18:55 | 0 | 2015-11-04 11:18:55 | 2015-11-04 11:18:57 |
+---------------------+---------------------+---+---------------------+---------------------+
1 row in set (2.01 sec)
Как вы видете, SYSDATE()
увеличивается во время запроса, в то время как NOW()
остается постоянным. Оказывается, что UNIX_TIMESTAMP()
Также оценивается один раз за запрос:
mysql> select UNIX_TIMESTAMP(), SLEEP(2), UNIX_TIMESTAMP();
+------------------+----------+------------------+
| UNIX_TIMESTAMP() | SLEEP(2) | UNIX_TIMESTAMP() |
+------------------+----------+------------------+
| 1446635945 | 0 | 1446635945 |
+------------------+----------+------------------+
1 row in set (2.00 sec)
Я думаю, что это так же, как для NOW()
функция:
NOW() возвращает постоянное время, которое указывает время, когда оператор начал выполняться. (Внутри хранимой функции или триггера NOW() возвращает время, когда функция или запускающий оператор начали выполняться.) Это отличается от поведения SYSDATE(), которое возвращает точное время, в которое она выполняется.
К сожалению, нет конкретной документации для других функций в этом случае. Если вы хотите убедиться, чтобы всегда иметь одинаковое значение, просто NOW()
с UNIX_TIMESTAMP()
, лайк
SELECT UNIX_TIMESTAMP(NOW());