Сильное зависание MYSQL - "Copying to tmp table"

12
Aisamiery
На сайте с 12.04.2015
Offline
318
#11

Мне так нравяться такие запросы :)

AND P.post_date < NOW()

Вы реально не знаете какая сейчас дата и хотите вычислить её для каждой строки из миллиона в табличке? Я понимаю когда NOW используют на инсертах, но где либо еще это выглядит как минимум странно, а во воторых отнимает кучу ресурсов особенно на больших выборках.

Еще я в вашем запросе не увидел слово LIMIT. Вы точно хотите все строки до текущей даты получить с миллионной таблички?

Короче оптимизация, оптимизация оптимизация

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
[umka]
На сайте с 25.05.2008
Offline
456
#12
Aisamiery:
Мне так нравяться такие запросы :)

AND P.post_date < NOW()


Вы реально не знаете какая сейчас дата и хотите вычислить её для каждой строки из миллиона в табличке?

Про отложенную публикацию не слышали? :)

NOW() в таком виде вычисляется единожды, в момент создания запроса, а не для каждой строчки.

Лог в помощь!
Оптимизайка
На сайте с 11.03.2012
Offline
396
#13
'[umka:
;14925131']NOW() в таком виде вычисляется единожды, в момент создания запроса, а не для каждой строчки.

Unfortunately, such queries are not cached by MySQL.

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
[umka]
На сайте с 25.05.2008
Offline
456
#14
Оптимизайка:
Unfortunately, such queries are not cached by MySQL.

А при чём тут кеширование запросов? Речь шла об "вычислить её для каждой строки".

NOW() returns a constant time that indicates the time at which the statement began to execute.

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_now

Aisamiery
На сайте с 12.04.2015
Offline
318
#15
'[umka:
;14925131']
NOW() в таком виде вычисляется единожды, в момент создания запроса, а не для каждой строчки.

Это что то новенькое ))) Всё это так, пока вы юзаете NOW в секции SELECT, как в примерах из документации по вашей ссылке, как только вы юзаете его в секции WHERE правила меняються. Вы можете потестить на досуге если что. А все дело в том, что он возвращает системное время до доли секунды, тем самым не попадая в кэш ну уж никак и БД приходится вычислять все время. Если уж так нужна дата, то для этого есть CURDATE(), а еще лучше подставить туда скалярное значение.

[umka]
На сайте с 25.05.2008
Offline
456
#16
Aisamiery:
Это что то новенькое ))) Всё это так, пока вы юзаете NOW в секции SELECT, как в примерах из документации по вашей ссылке, как только вы юзаете его в секции WHERE правила меняються. Вы можете потестить на досуге если что. А все дело в том, что он возвращает системное время до доли секунды, тем самым не попадая в кэш ну уж никак и БД приходится вычислять все время. Если уж так нужна дата, то для этого есть CURDATE(), а еще лучше подставить туда скалярное значение.

Вы документацию-то пробовали читать? Или у вас только своя вольная интерпретация имеется?

Ещё раз приведу эту же строчку:

"NOW() returns a constant time that indicates the time at which the statement began to execute."

И по-русски дословно:

"NOW() возвращает временнУю константу, указывающую, в какой момент времени начал выполняться запрос."

Вот вам пример, который выводит одну строку из таблицы, хотя по вашему утверждению должен выводить две.

И не вводите людей в заблуждение!


CREATE TABLE `test` (
`ts` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` SET `ts`=NOW()-INTERVAL 5 SECOND;
INSERT INTO `test` SET `ts`=NOW()+INTERVAL 2 SECOND;

SELECT SLEEP(5), `ts` FROM `test` WHERE `ts`<NOW();
Aisamiery
На сайте с 12.04.2015
Offline
318
#17

[umka], Вы сначала почитайте про порядок выполнения запросов select

Если вы думаете что ваш SLEEP реально тормозит выборку перед WHERE вы сильно ошибаетесь. Сначала собирается коллекция на основе WHERE, потом фильтруеться по HAVING и уже после этого выбираются поля (срабатывает ваш SLEEP)

[umka]
На сайте с 25.05.2008
Offline
456
#18
Aisamiery:
Сначала собирается коллекция на основе WHERE, потом фильтруеться по HAVING и уже после этого выбираются поля (срабатывает ваш SLEEP)

Вы уж определитесь, NOW() выполняется для формирования выборки или для каждой строки.

Aisamiery:
Вы реально не знаете какая сейчас дата и хотите вычислить её для каждой строки из миллиона в табличке?
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий