Как оптимизировать запросы в mysql?

Есть запросы которые при меньшей нагрузке выполняются меньше секунды, потом как бывает некая нагрузка 300-400 юзеров онлайн, начинают выполнятся от 5 секунд до 120с+

Запрос №1
SELECT count(DISTINCT product.id)
FROM `product`
JOIN `city` ON city.id=product.city_id
JOIN `company` ON company.id=product.company_id
WHERE ((((`product`.`id` in (
					select product_id from product_to_city
					join city on (city.id = product_to_city.city_id)
					where city.id = 104 or city.parent_id = 104
				)))) AND (`product`.`publish` = 1 AND `product`.`archive` != 1 AND `product`.`delete` != 1));

Запрос №2
SELECT count(*)
FROM (SELECT `product`.`id`, `product`.`position`, `product`.`description`, `product`.`city_id`,  `product`.`price`,  `product`.`company_id`, `company`.`company_type`, `city`.`name` AS `city_name`
FROM `product_to_tag` `p2t`
JOIN `product` ON product.id = p2t.product_id
JOIN `product_to_city` `ptc` ON product.id = ptc.product_id
JOIN `city` `c` ON c.id = ptc.city_id
LEFT JOIN `city` `city` ON city.id=product.city_id
LEFT JOIN `company` ON company.id=product.company_id
WHERE ((((`product`.`id` in (
					select product_id from product_to_city
					join city on (city.id = product_to_city.city_id)
					where city.id = 1 or city.parent_id = 1
				)))) AND (`product`.`publish` = 1 AND `product`.`archive` != 1 AND `product`.`delete` != 1)) AND (product.id !=  513568) AND (c.id = 1 or c.parent_id = 1) AND ((`p2t`.`tag_id` IN (14, 30, 37, 500)))
GROUP BY `product`.`id`
ORDER BY `product`.`timestamp_update` DESC) as count;


в логах долгих запросов после второго запроса даже простые запросы медленно начинают выполнятся

# Query_time: 256.971239 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
UPDATE product SET `view_count` = `view_count` + 1 WHERE id = '2797283';

# Query_time: 554.572351 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
UPDATE product SET `view_count` = `view_count` + 1 WHERE id = '2156047';

# Query_time: 646.604457 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
UPDATE product SET `view_count` = `view_count` + 1 WHERE id = '2104649';

как еще оптимизировать? Индексы все расставлены
  • Вопрос задан
  • 1100 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Попробуйте без подзапросов:
SELECT count(DISTINCT product.id)
    FROM `product`
    JOIN `product_to_city` ON `product`.`publish` = 1 
        AND `product`.`archive` != 1 AND `product`.`delete` != 1
        AND `product_to_city`.`product_id` = `product`.`id`
    JOIN `city` AS `c` ON (`c`.`id` = 104 OR `c`.`parent_id` = 104)
        AND `c`.`id` = `product_to_city`.`city_id`
    JOIN `city` ON `city`.`id` = `product`.`city_id`
    JOIN `company` ON `company`.`id` = `product`.`company_id`
Ответ написан
yoj_nc
@yoj_nc
Junior web developer
кеширование, процедурки, индексы
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы