Dram

Рейтинг
1114
Регистрация
28.06.2008

Попробовал выполнить эксплейн части запроса

select min(comments.created) from `comments` where `object_group` = 'avto'

В итоге -

rows - 149941 Using index condition

Если я правильно понимаю. Запрос виснет потому что кол-во фирм умножаются на 149941

в результате запрос пытается перебрать 3 млрд.!!! строк? Я все верно понял?

---------- Добавлено 29.01.2018 в 13:44 ----------

Можно по другому:

1. Найти все фирмы, у которых поле created младше чем самый старый коммент,

например created = 2015-07-10 16:20:00

а самый старый коммент для фирмы с created = 2013-07-10 16:20:00

2. Обновить created у этих фирм сделав его на месяц старше самого старого коммента

Эти таблицы проиндексированы в доль и поперек ибо они самые ходовые на сайте. На всех полях индексы есть.

Эксплейн показывает что на скрине.

P.S. я попробовал добавить условие

where `object_group` = 'avto'

решил обновлять по категориям. Эксплейн тут же показал сокращение графы DEPENDENT SUBQUERY с 300K до 4 !!!! Но все равно запрос виснет

png 170723.png

перепроверил все, да была ошибка, все поправил в итоге запрос

update firm set created = IFNULL(DATE_SUB((select min(comments.created) from comments where firm.Id = object_id group by object_id), INTERVAL 1 MONTH), firm.created);

как завис на минуту с чем то так и вывалился с ошибокой 504 по тайтауту.

Решил я проверить на одной фирме добавив в запрос

and firm.id = 11004

все равно запрос завис и ничем не закончился

P.S. таблица комментов большая (более 300k записей), но почему даже по одной фирме запрос не отработал

Синтаксис неправильный, мускуль ругается

#1054 - Неизвестный столбец 'comments.created' в 'field list'

Вероятно нужно как то назначить таблицы по типу

база.firm AS t2 и т.п. , пробую найти примеры...

hrach:
как-то так (на мускуле не пробовал), пробуйте:

Не вижу в вашем варианте "минус месяц" от даты коммента при обновлении поля крейтед у фирмы

AutoSearches:
update firm set created =  DATE_SUB((select min(comments.created) from comments where firm.Id = object_id group by object_id), INTERVAL 1 MONTH);


При условии что есть комментарий для каждой фирмы

А если нет - как добавить условие чтобы затронуло только тех у кого есть комменты?

Если если комментов нет - запись просто не обработает? (что меня тоже устраивает)

ziliboba0213:
Через mysql, да еще и 1 запросом не получится, скорей всего.

100% получится, но у меня знаний не хватает все это соединить в запрос.

Вы зачем то делаете

"UPDATE `comments`

когда задача - Задача - обновить created у фирм

Все же прошу знающий мускуль подсказать решение в виде запроса...

Мне кажется можно проще как-то - одним запросом с объединением таблиц.

Jaroslav57:
В чем проблема с такой посещалкой взять нормальный VDS и оптимизировать самому все?

Вероятно в этом...

semur123:
Что такое индексы?

Вообще не понятно как можно написать самому сайт и не знать основ про Mysql

Всего: 6924