ПОМОГИТЕ пожалуйста упростить сложнейший запрос, очень тормазит, спасибо

lrlr

Новичок
Помогите пожалуйста
есть запрос который работает очень медленно...
нужно его ускорить

вот запрос который выполняется 30 секунд

UPDATE `userlist` SET `status` = 'tested', `limit` = '0' WHERE `status` = 'works' AND (SELECT COUNT(*) FROM `visitors` WHERE `where` = `userlist`.`url` AND DATE(datetime) = ADDDATE(DATE(NOW()),-1) LIMIT 0 , 3) < 3


написал вот такой запрос упростив, но запускать боюсь
правильно ли я сделал или можно как то подругому еще сделать???


UPDATE `userlist` AS `u`
LEFT JOIN (
SELECT `where`, COUNT(*) AS `count`
FROM `visitors`
WHERE DATE(`datetime`) = ADDDATE(DATE(NOW()), -1)
GROUP BY `where`
ORDER BY NULL
) AS `v` ON `u`.`url` = `v`.`where`
SET `u`.`status` = 'tested', `u`.`limit` = '0'
WHERE `u`.`status` = 'works' AND IFNULL(`v`.`count`, 0) < 3
может есть другие варианты
база растет и все медленнее и медленнее работает...
 

lrlr

Новичок
в первом варианте запрос работает аж 40 сек
нужно его ускорить
хочу как то виртуально обьеденить 2 таблицы а потом их обновлять, чтоб тип получилась 1, а с одной работать уже можно быстро
а то так это цикл в цикле

таблица визиторс 210300 записей
таблица юзерлист 570 записей
через месяц все удвоится
 

lrlr

Новичок
второй вариант что сам сделал запускать боюсь и не знаю работает ли он вообще
 

lrlr

Новичок
итак...
второй запрос набрался смелости и проверил
мозг не подвел
он работает и время его выполнения 0.1 сек
напомню что первый выполнялся 30-40 сек
но вот на счет того правильно ли он в базе все обновил понять не могу потому что слишком большая база
нужен ответ на вопрос правильно ли я составил второй запрос?

прошу потратить свое время всем кто хорошо знает данную тему, потому как вопрос не детский...
 

Gas

может по одной?
Рекомендации для исходного запроса:
1. замени условие DATE(datetime) = ADDDATE(DATE(NOW()),-1) на datetime BETWEEN [начало_дня] AND [конец дня]
2. создай составной индекс (where,datetime). Если в where хранятся строки больше 30 символов, можно вместо составного индекса завести поле md5(concat(where, date(datetime))) и на него навесить индекс.

Ну раз доработанный запрос 0.1 сек выполняется, то его и оставь, на первый взгляд правильный.
 
Сверху