Dram

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

А зарегать ИП, платить 6% и спать спокойно религия не позволяет?

Большое спасибо, индекс помог и запрос отработал за 1.4 сек.!

CREATE TABLE `comments` (

`id` int(11) NOT NULL,

`object_group` varchar(32) NOT NULL,

`object_id` int(11) NOT NULL,

`created` datetime NOT NULL,

`ip` varchar(64) NOT NULL,

`user_id` int(11) NOT NULL,

`rate` int(11) NOT NULL,

`country` varchar(64) NOT NULL,

`status` int(11) NOT NULL,

`username` varchar(128) NOT NULL,

`email` varchar(64) NOT NULL,

`isgood` int(11) NOT NULL,

`ispoor` int(11) NOT NULL,

`description` text NOT NULL,

`revision` int(11) NOT NULL,

`links` text NOT NULL,

`images` int(11) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--

-- Индексы сохранённых таблиц

--

--

-- Индексы таблицы `comments`

--

ALTER TABLE `comments`

ADD PRIMARY KEY (`id`),

ADD KEY `user_id` (`user_id`),

ADD KEY `index7` (`revision`),

ADD KEY `created` (`created`),

ADD KEY `ip-country` (`country`,`ip`) USING BTREE,

ADD KEY `object_group` (`object_group`,`object_id`) USING BTREE,

ADD KEY `status` (`status`),

ADD KEY `userid_id` (`user_id`,`id`),

ADD KEY `object_group_2` (`object_group`,`object_id`,`rate`) USING BTREE;

ФИРМЫ

-- Структура таблицы `firm`
--

CREATE TABLE `firm` (
`id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`section_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
`alias` varchar(255) CHARACTER SET utf8 NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`name` varchar(255) CHARACTER SET utf8 NOT NULL,
`title` varchar(255) CHARACTER SET utf8 NOT NULL,
`keywords` text CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`header` varchar(255) CHARACTER SET utf8 NOT NULL,
`text` text CHARACTER SET utf8 NOT NULL,
`preview_src` varchar(255) CHARACTER SET utf8 NOT NULL,
`preview_alt` varchar(255) CHARACTER SET utf8 NOT NULL,
`preview_title` varchar(255) CHARACTER SET utf8 NOT NULL,
`preview_border` int(11) NOT NULL,
`reviews` datetime NOT NULL,
`rate` int(11) NOT NULL,
`vote` int(11) NOT NULL,
`average` float NOT NULL,
`comments` int(11) NOT NULL,
`count_agents` int(11) NOT NULL,
`count_doctors` int(11) NOT NULL,
`count_images` int(11) NOT NULL,
`count_stock` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `firm`
--
ALTER TABLE `firm`
ADD PRIMARY KEY (`id`),
ADD KEY `group_id` (`group_id`),
ADD KEY `average` (`average`),
ADD KEY `name` (`name`),
ADD KEY `category_id` (`category_id`),
ADD KEY `section_id` (`section_id`),
ADD KEY `city_id` (`city_id`);

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

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% получится, но у меня знаний не хватает все это соединить в запрос.

Всего: 6927