У меня есть этот запрос ниже. Существует четыре основных таблицы: tblOrder, tblItems, tblOrder_archive, tblItem_archive. Заказы и элементы перемещаются в заархивированные версии таблиц через несколько месяцев, чтобы не замедлять выполнение основных табличных запросов. (продажи и оборот ДЕЙСТВИТЕЛЬНО ВЫСОКИЙ). Поэтому, чтобы получить данные о продажах, я выбираю то, что мне нужно, из каждого набора таблиц (архив и не архивный). Объедините их .. сделайте группу по объединению .. затем выполните некоторую математику по результату.Нужна помощь в оптимизации сложного запроса MySQL
Проблема в том, что с любым значительным количеством строк (временной интервал заказа) .. для выполнения запроса потребуется столько времени, сколько времени истечет. Я добавил все ключи, о которых я могу думать, и все еще работает очень медленно.
Есть ли еще больше, чтобы сделать это быстрее? Могу ли я написать его по-другому? Могу ли я использовать разные индексы?
или должен ли я написать сценарий, который сначала получает данные из каждой таблицы, а затем выполняет ли математика в скрипте php их комбинирование?
Спасибо за помощь.
SELECT
description_invoice
, supplier
, type
, sum(quantity) AS num_sold
, sum(quantity*wholesale) AS wholesale_price
, sum(quantity*price) AS retail_price
, sum(quantity*price) - sum(quantity*wholesale) AS profit
FROM (
SELECT
tblOrder.*
, tblItem.description_invoice
, tblItem.type
, tblItem.product_number
, tblItem.quantity
, tblItem.wholesale
, tblItem.price
, tblItem.supplier
FROM tblOrder USE KEY (finalized), tblItem
WHERE
tblItem.order_id = tblOrder.order_id
AND
finalized=1
AND
wholesale <> 0
AND (order_time >= 1251788400 AND order_time <= 1283669999)
UNION
SELECT
tblOrder_archive.*
, tblItem_archive.description_invoice
, tblItem_archive.type
, tblItem_archive.product_number
, tblItem_archive.quantity
, tblItem_archive.wholesale
, tblItem_archive.price
, tblItem_archive.supplier
FROM tblOrder_archive USE KEY (finalized), tblItem_archive
WHERE
tblItem_archive.order_id=tblOrder_archive.order_id
AND
finalized=1
AND
wholesale <> 0
AND (order_time >= 1251788400 AND order_time <= 1283669999)
) AS main_table
GROUP BY
description_invoice
, supplier,type
ORDER BY profit DESC;
Вы можете показать нам, какие индексы (ключи) вы создали? –