powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортировка по динамическому знаечнию
7 сообщений из 7, страница 1 из 1
Сортировка по динамическому знаечнию
    #38926819
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!

Задача:
0) Посмотреть сколько раз значения table1 встречаются в table2 => count
1) Отсортировать table1 по значению count

Написал запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
    PRODUCT_ID,
    count(t2.`ID`) count
FROM
    table2 t2
JOIN `table1` t1
    ON t1.`IBLOCK_ELEMENT_ID` = t2.`PRODUCT_ID`
WHERE
     t1.`VALUE` = '5190'

GROUP BY
     PRODUCT_ID
ORDER BY count DESC



По моему мнению индексация вряд ли поможет, т.к. сортируем по динамическому значению. Так ли это?

Есть ли способы ускорения? На данный момент запрос отрабатывает за 20 минут!
...
Рейтинг: 0 / 0
Сортировка по динамическому знаечнию
    #38926822
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кириллnot,

план запроса покажите
...
Рейтинг: 0 / 0
Сортировка по динамическому знаечнию
    #38926851
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллnotДобрый вечер!

Задача:
0) Посмотреть сколько раз значения table1 встречаются в table2 => count
1) Отсортировать table1 по значению count

Написал запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
    PRODUCT_ID,
    count(t2.`ID`) count
FROM
    table2 t2
JOIN `table1` t1
    ON t1.`IBLOCK_ELEMENT_ID` = t2.`PRODUCT_ID`
WHERE
     t1.`VALUE` = '5190'

GROUP BY
     PRODUCT_ID
ORDER BY count DESC



По моему мнению индексация вряд ли поможет, т.к. сортируем по динамическому значению. Так ли это?


так.



Есть ли способы ускорения? На данный момент запрос отрабатывает за 20 минут!

для данного запроса нужны два индекса,
по t1.`VALUE`
и по t2.`PRODUCT_ID`.

при этом сам group by тоже может поиметь ползу от индекса по product.
...
Рейтинг: 0 / 0
Сортировка по динамическому знаечнию
    #38927037
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,


idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEt1ALLix_iblock_elem_props_t1_13074670Using where; Using temporary; Using filesort1SIMPLEt2refIXS_BASKETS_PRODUCT_IDIXS_BASKETS_PRODUCT_ID4bitrix.t1.IBLOCK_ELEMENT_ID7Using index
...
Рейтинг: 0 / 0
Сортировка по динамическому знаечнию
    #38927040
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте создать индекс по t1.`VALUE` и выполнить OPTIMIZE TABLE для обоих таблиц. После этого смотрите время выполнения и план.
...
Рейтинг: 0 / 0
Сортировка по динамическому знаечнию
    #38928493
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Спасибо! Буду пробовать
...
Рейтинг: 0 / 0
Сортировка по динамическому знаечнию
    #38928526
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старайтесь: 1) вместо INNER JOIN использовать декарт с отбором - лучше видно происходящее; 2) для всех полей указывать алиасы таблиц. Если следовать этому, получится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
    t2.PRODUCT_ID,
    count(t2.`ID`) count
FROM
    table2 t2,
   `table1` t1
WHERE t1.`IBLOCK_ELEMENT_ID` = t2.`PRODUCT_ID`
  AND   t1.`VALUE` = '5190'
GROUP BY t2.PRODUCT_ID
ORDER BY 2 DESC



Я ещё дополнительно заменил имя столбца сортировки на его номер. Некритично.

Сразу возникает вопрос - почему COUNT считаем по t.ID? Зачем привлекать лишнее поле? Гораздо разумнее считать либо поле группировки, либо количество записей. В данном случае разумнее первое - потому что тогда серверу можно использовать индекс по полю таблицы table2 как покрывающий. И по двум полям таблицы table1. Т.е.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
    t2.PRODUCT_ID,
    count(t2.PRODUCT_ID) count
FROM
    table2 t2,
    table1 t1
WHERE t1.IBLOCK_ELEMENT_ID = t2.PRODUCT_ID
  AND t1.VALUE = '5190'
GROUP BY t2.PRODUCT_ID
ORDER BY 2 DESC



И соответственно индексы:
table1 (VALUE, IBLOCK_ELEMENT_ID)
table2 (PRODUCT_ID)

А вот от Using temporary; Using filesort - скорее всего не избавиться.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортировка по динамическому знаечнию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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