|
Оптимизация group by при объединении таблиц
|
|||
---|---|---|---|
#18+
Добрый день, существует 3 таблицы. Таблица product Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
Таблица attribute Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Таблица product_attribute Код: sql 1. 2. 3. 4. 5. 6. 7.
Необходимо выбрать атрибуты, которые подходят под фильтр, реализовано это таким образом Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Если ставми LIMIT 25, то запрос выполняется быстро, если LIMIT 100, то запрос замедляется более чем в 10 раз. Проблема заключается в том, что атрибуты мы должны выбрать все, но скорость очень сильно падает. План запроса Код: sql 1. 2. 3.
Записей в product > 40000, attribute 380, product_attribute > 250000 и база будет расти. В качестве СУБД использую MySQL 8.0.26. Не могли бы вы подсказать в чем может быть проблема(Долго выполняется запрос) и как его оптимизировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2021, 16:02 |
|
Оптимизация group by при объединении таблиц
|
|||
---|---|---|---|
#18+
Во-первых, запрос какой-то жестокий и бессмысленный... какой великий смысл выбирать только атрибуты, да с возможным дублированием, да с возможными NULL, да ещё и LIMIT без сортировки... и при этом не смотреть, к какому продукту они относятся. Во-вторых, а почему в структуре нет FK? В третьих, какой может быть физический смысл у нулевой цены? На самом деле вопросов гораздо больше... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2021, 18:01 |
|
Оптимизация group by при объединении таблиц
|
|||
---|---|---|---|
#18+
Akina, Мы выводим динамически меню, которое включает в себя атрибуты, а атрибуты получаем на основе тех продуктов, которые есть в наличии и в которых есть цена и изображение. То есть в условие where приходят product_id, к которым нужно получить атрибуты. Получить нужно только атрибуты, подходящие к этим product_id ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2021, 18:26 |
|
Оптимизация group by при объединении таблиц
|
|||
---|---|---|---|
#18+
Ekzis , ну тогда сразу - заменить LEFT JOIN на INNER и добавить DISTINCT. Далее - разбираемся с AND p.price > 0 AND p.quantity > 0 AND p.status > 0 . 1) price может быть нулём? может быть NULL? 2) status - некий ограниченный фиксированный набор значений? если да - укажите его. Дальше. Создайте индексы oc_product (product_id, image, price, quantity, status) и oc_product (image, product_id, price, quantity, status) . Посмотрите в плане, будет ли какой-то из них использоваться, если да - оставьте его. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 07:47 |
|
Оптимизация group by при объединении таблиц
|
|||
---|---|---|---|
#18+
Akina, спасибо, но скорости пока не прибавилось. На счет price, есть продукты, где он должен быть равен именно 0. Индексы создал, в приоритете использует тот, который был изначально. Если его убрать, то каждый индекс, который вы посоветовали используется, но скорости он, к сожалению, не дает ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 10:58 |
|
|
start [/forum/topic.php?fid=47&msg=40097503&tid=1827953]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 235ms |
total: | 484ms |
0 / 0 |