- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
UPDATE x55_cl_items SET count_do = (SELECT COUNT(id) FROM x55_do_working WHERE x55_do_working.cl_id = x55_cl_items.id)
Этот запрос выполняется долго. НЕмного подумал понял что обновление всех записей мне и не нужно, а хватит только тех что я изменял за последний месяц. Как сюда правильно добавить?
Пробовал добавить тупо в конец первого запроса, но EXPLAIN показывает что выборка не уменьшается...
Dram, этот запрос делается в скрипте через PHP или разово через Mysql (например, через PHPMyAdmin)?
Если первый случай, то здесь проблема в том, что для каждой строки из x55_cl_items подзапрос выполняется отдельно (то есть, условно count(id) будет подсчитываться 1000-и раз, а это уже сам по себе не медленный запрос). Поэтому его лучше выполнить отдельно, а затем уже делать запрос на обновление полей присвоив полученной значение.
Ну и лучше использовать count(*) вместо count(id) - с таким запросом база будет работать быстрее.
индекс по x55_do_working.cl_id
и примари индекс по x55_cl_items.id
Если случай второй - то набросайте php-скрипт, который запускайте, чтобы сделать выше описанное :)
у вас две таблицы :)
Этот запрос выполняется долго.
логично, что долго. для каждой строки из таблицы "item" выполняется запрос по табличке "working".
если у вас в "item" 1000 строк, то реально будет выполнено 1000+1 = 1001 sql запрос. упс, выше уже написали тоже самое, только сейчас прочитал :)
переписал ваш запрос, реально это будет два запроса, отработает моментально. нужен индекс по полю x55_do_working.id
Ну и лучше использовать count(*) вместо count(id) - с таким запросом база будет работать быстрее.
c count(id) - 0.9 сек
с count(*) - 1,03 сек
---------- Добавлено 21.09.2017 в 10:14 ----------
Я тут понял как ускорить запрос - не нужно апать всю таблицу x55_cl_items
Нужно апать только те x55_cl_items.id которые равны x55_do_working.cl_id
т.е. как-то так (жирным добавил
---------- Добавлено 21.09.2017 в 10:19 ----------
переписал ваш запрос, реально это будет два запроса, отработает моментально. нужен индекс по полю x55_do_working.id
Пока у меня в голове родилась такая каша :))
Получаем список ID фирм в которых есть работники
1. SELECT `cl_id` FROM `x55_do_working` GROUP BY `cl_id` HAVING COUNT(*)=1
Делаем подсчет сколько работников в каждой фирме
2. SELECT COUNT(id) FROM `x55_do_working` WHERE `cl_id` = каждая из записей запроса №1
Апаем только те клиники где есть работники, а не все
3. UPDATE x55_cl_items SET count_do = ЗАПРОС №2 WHERE `id` = ЗАПРОС №1
Как все это собрать в 1 запрос?
Dram, задача стала немного яснее, но не до конца. :)
Вам нужно в таблицу раз в месяц заносить количество работников для каждой компании? Почему для компании не сделать счётчик, который обновляется по факту добавления/удаления работника? Это обычный вариант для того, чтобы не юзать ресурсоемкий count.
count_do это и есть счетчик сотрудников в таблице x55_cl_items - он обновляется по крону раз в 10 минут (да там часто все меняется). Но запрос тяжеловат, я хочу попытаться сделать его побыстрее.
Додумался до того что не нужно апать всю таблицу x55_cl_items нужно апнуть только фирмы где есть сотрудники.
Chukcha, спасибо - 0,6 сек. Почти в 2 раза быстрее - это предел?
Если вы уменьшите вторую выборку по времени, то возможно, будет еще быстрее, количество записей второй таблицы уменьшится.
Вот эксплейн вашего запроса