Индексы в основном бесполезны из-за OR
, как в
AND (carrierbil3_.IS_APPROVED = 0
OR carrierbil3_.IS_APPROVED IS NULL)
Простой способ исправить это выбрать либо 0 или NULL
для представления флага.Затем убедитесь, что все данные согласованы, и измените WHERE
, чтобы просто проверить один случай.
Вы действительно означает
CROSS JOIN
CLIENT client21_
То естьскорее всего, это повлияет на производительность и создаст огромный набор результатов.
Не берите в голову.У вас есть ON
в WHERE
.Пожалуйста, используйте ON
для отношений и WHERE
для фильтрации.
WHERE
shipmentor0_.CLIENT_ID = client21_.CLIENT_ID
Я вижу смесь LEFT JOIN
и JOIN
.Убедитесь, что LEFT JOINs
действительно должно быть LEFT
;то есть в «правильной» таблице могут отсутствовать данные.
Для дальнейшего обсуждения предоставьте EXPLAIN SELECT ...
.
Отказ от нормализации:
У вас есть 5 таблицописать местоположение (название, страна, почтовый индекс, штат, город).Вместо этого я рекомендую таблицу single с этими 5 столбцами.Это, в одиночку, избавило бы от 8 JOINs
.
CAST(carrier4_.IDENTITY AS SIGNED)
- Вы не можете исправить тип данных на SIGNED
или разрешить значение UNSIGNED
?
Но, пожалуй, основным фактором, снижающим производительность, является синдром "взорваться-взорваться".Во-первых, он много делает JOINs
, строит огромную промежуточную таблицу, а затем разрушает это, выполняя GROUP BY
.Средство правовой защиты -
SELECT ...
FROM ( SELECT SUM(...), SUM(...) FROM ... GROUP BY ... ) AS a
JOIN ((whatever else is needed));
То есть сначала разработайте минимальную «производную таблицу», которая составляет GROUP BY
(и / или ORDER BY
и / или LIMIT
).Затем посмотрите, что еще нужно для выполнения запроса (а именно все поиски нормализации).
После того, как вы ответили на большинство моих комментариев, мы можем обсудить, есть ли у вас оптимальные индексы.(Сейчас делать это преждевременно.) Если это так, пожалуйста, начните новый Вопрос;было бы слишком много беспорядка, чтобы добавить к этому.