powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запросы в mysql?
12 сообщений из 12, страница 1 из 1
Как оптимизировать запросы в mysql?
    #39444385
khurshed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запросы которые при меньшей нагрузке выполняются меньше секунды, потом как бывает некая нагрузка 300-400 юзеров онлайн, начинают выполнятся от 5 секунд до 120с+

Запрос №1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT count(*)
FROM (SELECT `product`.`id`, `product`.`position`, `product`.`description`, `product`.`city_id`,  `production`.`price`,  `production`.`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;




в логах долгих запросов после второго запроса даже простые запросы медленно начинают выполнятся
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
# 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';



как еще оптимизировать? Индексы все расставлены
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39444392
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khurshed,

Версия MySQL?
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39444393
khurshed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, 5.5.53

еще оптимизировал чуток убрал под запрос из обоих запросов

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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`
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39445013
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khurshed
Код: sql
1.
`c`.`id` = 104 OR `c`.`parent_id` = 104

А вот это зачем так?
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39445342
khurshed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

чтобы выбрать товары этого региона и его городов
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39445356
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khurshed , в многотабличном запросе лучше давать алиасы ВСЕМ таблицам.
Перенесите условия отбора по первой таблице из секции ON в секцию WHERE.
И я бы вообще записал запрос в такой форме:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT count(DISTINCT p.id)
FROM product p
   , product_to_city pc
   , city c1 
   , city c2
   , company c
WHERE p.publish = 1 
  AND p.archive != 1 
  AND p.delete != 1
  AND pc.product_id = p.id
  AND (c1.id = 104 OR c1.parent_id = 104)
  AND c1.id = pc.city_id
  AND c2.id = p.city_id
  AND c.id = p.company_id

и посмотрел бы на план - и насчёт оптимальных индексов, и, возможно, ещё бы избавился и от OR...
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39445359
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё мне непонятна необходимость нагружать подсчёт связями с таблицами городов и компаний - или это попытка отсеять записи, для которых город и/или компания не указаны?
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39445557
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закэшируй их и не парься.
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39447008
khurshed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, а второй запрос есть возможность как то оптимизировать? он тоже жестко тормозит при нагрузке
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39447018
khurshed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока второй запрос переписал так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT count(*)
FROM (SELECT `product`.`id`
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`) as count;
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39447548
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khurshed,

В версиях до 5.6 старайтесь избегать конструкции IN (SELECT ...)
Там был баг, из-за которого вложенный SELECT выполнялся много раз, по разу для каждого проверяемого значения.
...
Рейтинг: 0 / 0
Как оптимизировать запросы в mysql?
    #39447676
khurshed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, а как сделать по другому? OR вроде как тоже нагружает.... сейчас избавился от group вот как выглядит запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT count(distinct(product.id))
FROM `product`
JOIN `product_to_tag` `p2t` 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)))
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запросы в mysql?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]