Dram

Рейтинг
1115
Регистрация
28.06.2008
danforth:
Дайте угадаю, таблица table2 у вас маленькая?.

table1 самая большая - более 300.000 записей

table2 - примерно 25000

остальные мизер. На всех полях что участвуют в объединении есть индексы. Результат запроса одинаков абсолютли

---------- Добавлено 23.09.2017 в 13:04 ----------

Chukcha:
Потому что первый вообще какой-то "левый"....
Может Вам нужен...

Попробовал ваш запрос - результат тот же - время выполнения 4,4 сек. т.е. дольше всех

Chukcha, ну вы мастер - спасибо! :)))

только что понял что моя логика не верна. Если удалить у фирмы работников, то счетчик уже не обновлится при таких запросах....

Надо че-то еще придумать.

Вот эксплейн вашего запроса

png 166809.png

Chukcha, спасибо - 0,6 сек. Почти в 2 раза быстрее - это предел?

count_do это и есть счетчик сотрудников в таблице x55_cl_items - он обновляется по крону раз в 10 минут (да там часто все меняется). Но запрос тяжеловат, я хочу попытаться сделать его побыстрее.

Додумался до того что не нужно апать всю таблицу x55_cl_items нужно апнуть только фирмы где есть сотрудники.

Пока у меня в голове родилась такая каша :))

Получаем список 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 запрос?

Dreammaker:
Ну и лучше использовать 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

т.е. как-то так (жирным добавил

UPDATE x55_cl_items SET count_do = (SELECT COUNT(id) FROM x55_do_working WHERE x55_do_working.cl_id = x55_cl_items.id) WHERE x55_cl_items.id = x55_do_working.cl_id



---------- Добавлено 21.09.2017 в 10:19 ----------

admak:
переписал ваш запрос, реально это будет два запроса, отработает моментально. нужен индекс по полю x55_do_working.id
Ваш запрос отработал не правильно (не правильно обновил count_do она везде стала 1) + по эксплейн обратобал в 300 раз больше строк и по времени был так же 1.09 сек. Указанные вами индекс был и раньше.

Вопрос снят - сам допер как ускорить - WHERE t1.userid > 0

Вроде как для PHP 7 нужен не Memcache, а Memcached

https://habrahabr.ru/company/avito/blog/338140/

LEOnidUKG правильно советует обновить мускуль, очевидно же что это ваше самое слабое место, а вы оптимизируете все кроме него :)))

Всего: 6928