Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортировка по динамическому знаечнию / 7 сообщений из 7, страница 1 из 1
03.04.2015, 23:53:00
    #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
03.04.2015, 23:58:14
    #38926822
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по динамическому знаечнию
Кириллnot,

план запроса покажите
...
Рейтинг: 0 / 0
04.04.2015, 01:13:10
    #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
04.04.2015, 14:02:43
    #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
04.04.2015, 14:12:57
    #38927040
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по динамическому знаечнию
Попробуйте создать индекс по t1.`VALUE` и выполнить OPTIMIZE TABLE для обоих таблиц. После этого смотрите время выполнения и план.
...
Рейтинг: 0 / 0
06.04.2015, 19:49:02
    #38928493
Кириллnot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по динамическому знаечнию
miksoft,

Спасибо! Буду пробовать
...
Рейтинг: 0 / 0
06.04.2015, 20:55:34
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортировка по динамическому знаечнию / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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