Нужна помощь для оптимизации запроса MySQL с несколькими объединениями

Здравствуйте, у меня есть следующий SQL-запрос, он работает, но это довольно медленно

SELECT
ep . *,
t_u.sUsername AS sLockedBy,
epi.sName,
em.sName AS sManufacturerName,
SUM(IF(eop.dInProduction IS NULL
AND eop.dFromProduction IS NULL
AND eop.dShipped IS NULL
AND eop.nIsCancelled = 0
AND eos.sStatusCode NOT IN ('Canceled' , 'Finished', 'Complete'),
1,
0)) AS nProductOrdered,
SUM(IF(eop.dInProduction IS NOT NULL
AND eop.dFromProduction IS NULL
AND eop.dShipped IS NULL
AND eop.nIsCancelled = 0
AND eos.sStatusCode NOT IN ('Canceled' , 'Finished', 'Complete'),
1,
0)) AS nProductInProduction,
SUM(IF(eop.dInProduction IS NOT NULL
AND eop.dFromProduction IS NOT NULL
AND eop.dShipped IS NULL
AND eop.nIsCancelled = 0
AND eos.sStatusCode NOT IN ('Canceled' , 'Finished', 'Complete'),
1,
0)) AS nProductFromProduction,
SUM(IF(eop.dInProduction IS NULL
AND eop.dFromProduction IS NULL
AND eop.dShipped IS NULL
AND eop.nIsCancelled = 0
AND eos.sStatusCode NOT IN ('Canceled' , 'Finished', 'Complete'),
1,
0)) + ep.nInStock AS nStockCheck
FROM
eshop3_products AS ep
LEFT JOIN
users AS t_u ON ep.nUserLockID = t_u.nUID
AND t_u.nDeleted = 0
INNER JOIN
eshop3_products_i18n AS epi ON ep.nUID = epi.nProductID
AND epi.nLangID = 1
AND epi.nDeleted = 0
LEFT JOIN
eshop3_manufacturers AS em ON ep.nManufacturerID = em.nUID
AND em.nDeleted = 0
LEFT JOIN
eshop3_order_products AS eop ON ep.nUID = eop.nProductID
LEFT JOIN
eshop3_orders AS eo ON eop.nOrderID = eo.nUID
LEFT JOIN
eshop3_order_statuses AS eos ON eo.nUID = eos.nOrderID
AND eos.nUID = (SELECT
nUID
FROM
eshop3_order_statuses as eos
WHERE
eo.nUID = eos.nOrderID
ORDER BY eos.nUID DESC
LIMIT 1)
WHERE
(ep.nDeleted = 0)
GROUP BY ep.nUID
ORDER BY ep.sStoreCode ASC

Таблица продуктов имеет всего 462 строки,

Всего в таблицах статусов заказов 17 154 строки

Время выполнения запроса составляет 1,5 секунды, что я думаю, что это медленно.

Я использую INNER SELECT в предложении ON, чтобы получить последний статус для данного заказа, и здесь я думаю, что что-то не так.

Когда я удаляю таблицу статусов заказов из всего запроса, время выполнения в несколько раз быстрее 0,152 с.

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

Здесь вы идете sql с объяснением

введите описание изображения здесь

id  select_type        table type   possible_keys    key      key_len ref                            rows  Extra
1   PRIMARY            epi   ALL    nProductID                                                        408  Using where; Using temporary; Using filesort
1   PRIMARY            ep    eq_ref PRIMARY,nUID     PRIMARY        4 dragoni_zfms.epi.nProductID       1  Using where
1   PRIMARY            em    eq_ref PRIMARY          PRIMARY        4 dragoni_zfms.ep.nManufacturerID   1
1   PRIMARY            t_u   eq_ref PRIMARY          PRIMARY        4 dragoni_zfms.ep.nUserLockID       1
1   PRIMARY            eop   ref    id_productid     id_productid   5 dragoni_zfms.ep.nUID             13
1   PRIMARY            eo    eq_ref PRIMARY          PRIMARY        4 dragoni_zfms.eop.nOrderID         1  Using index
1   PRIMARY            eos   eq_ref PRIMARY,nOrderID PRIMARY        4 func                              1
2   DEPENDENT SUBQUERY eos   ref    nOrderID         nOrderID       4 dragoni_zfms.eo.nUID              1  Using where; Using index; Using filesort

-1

Решение

В вашем случае проще выполнять некоторые операции, не используя mysql, а используя php.
Я видел в своей практике случаи, когда вы выигрываете время. Пожалуйста, попробуйте разделить сложный запрос на несколько простых запросов. Затем выполните необходимую фильтрацию, используя php-скрипты.
Надеюсь, поможет.
Спасибо!

0

Другие решения

Других решений пока нет …