1. учите сразу опп, чтобы потом не переучиваться
2. почитайте про модели хранения деревьев (списки смежности, вложенные множества, ..)
3. в новых версиях MySQL/MariaDB есть with recursive, который легко решает вашу задачу (в старых можно эмулировать с помощью хранимой процедуры)
если уверены, что бд, то лог медленных запросов (и разбор, начиная с самых проблемных) + настройка параметров
возможно woocommerce не настроен (он, емнип, может генерить на ровном месте сотни кривых запросов)
возможно ...
У вас после select указаны поля, по которым не идет группировка, без групповых функций. Поэтому результат для этих полей может быть некорректным (при группировке берутся случайные значения из группы). Стандарт SQL вообще запрещает такие запросы, это MySQL при определенных настройках не ругается.
Выполните ваш запрос без группировки, тогда на небольшом кол-ве тестовых данных будет наглядно видно почему возникают неверные результаты.
О том как корректно написать запрос с группировкой, см статью Группировка в MySQL, там приведено 5 вариантов решения.
Сергей Протько: ну покажет explain, что решил использовать, например, отдельный индекс. И чем это поможет? Это стоит расценивать как нужность отдельного индекса?
Стратегия хреновая. Merge затратная операция. Умел он это и раньше, но делал крайне редко.
explain на этот вопрос не ответит
оверхед и большой будет при лишнем отдельном индексе на колонку:
-) занимает место
-) обновляется
-) оптимизатор выбирает какой из индексов лучше использовать
по индексам хорошо написано в книжке Зайцева "оптимизация производительности mysql" (есть в сети)
Mick Coder:
Не пользовался Yii2, но по идее в нем должен быть штатный способ решения.
Если не найдете, то средствами MySQL можно сделать триггер before insert, который будет преобразовывать дату.
включен ли query cache? если да, то попробуйте отключить
есть ли репликация? если да, то установите sync_binlog=0
посмотрите ещё sqlinfo.ru/forum/viewtopic.php?pid=38995
P.S. Собственно, в процитированной вами доке: