Dram

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

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 правильно советует обновить мускуль, очевидно же что это ваше самое слабое место, а вы оптимизируете все кроме него :)))

Сделал не помогло, да и не понятно как составные индексы на другие поля погли влиять на выборку по нужным полям.

dlyanachalas:
Теперь сделайте разделение всех индексов.

Сори не понял - что и как сделать?

Удаление составных индексов и добавление отдельных на эти поля не изменили эксплейн

png 15.png
png 16.png

А вот с этим запросом такой фокус не прошел почему-то

explain SELECT t1.id, t1.created, t1.description, t2.title, CONCAT_WS('-', t2.id, t2.alias)
AS item_alias, CONCAT_WS('-', t3.id, t3.alias) AS category_alias, CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM xfd3_comments_items AS t1
INNER JOIN xfd3_clinics_items AS t2 ON t1.object_id = t2.id
AND t1.object_group = 'com_clinics'
LEFT JOIN xfd3_clinics_sections AS t4 ON t2.section_id = t4.id
LEFT JOIN xfd3_clinics_categories AS t3 ON t2.category_id = t3.id
ORDER BY t1.id DESC LIMIT 3

на фото индексы таблицы xfd3_clinics_items. Я пробовал добавлять индексы на поля section_id и object_id - это не изменило эксплейн

png 12.png
png 14.png
Всего: 6924