Оптимизация SQL-выборки из большой таблице
На сайте есть раздел "Каталог". Там выводятся 10 товаров с их статистикой за всё время. Он открывается за 5 секунд. Работодатель недоволен и хочет чтоб открывался хотя бы за 2.
Как это выглядит на сервере: Идет выборка 10 товаров. Потом в цикле по ним собирается статистика из таблицы заказов. Проблема в том что таблица заказов очень большая. И будет только расти. А статистика нужна за всё время.
Все возможные индексы добавлены.
Я бы группировал где-нибудь статистику товаров за всё время в отдельной таблице... но в сборе статистики есть нюансы.
Например у заказа может быть партнер (столбец partner_id). И автор товара, например, может исключить нескольких партнеров, чтоб в этой статистике они не учитывались при подсчете.
Тогда мне приходится делать запрос WHERE partner_id NOT IN (айдишники)
Также в этом разделе есть сортировка товаров за неделю. Так соответственно берутся не все заказы. А только за неделю
То-есть даже если группировать в отдельную таблицу, то по дням и группируя по партнерам... И то я не уверен что это поможет
Пробовал суммировать столбцы всех 10 товаров за один запрос. Но время выполнения запроса все-равно примерно 2,7 сек.
Вот пример запроса для сбора статистики каждого товара:
SELECT
COUNT(*) AS orders_paid,
SUM(`amount`) AS `amount`,
SUM(`products`.`price`) AS `price`,
SUM(`price_for_author`) AS `price_for_author`
FROM
`orders`
JOIN `users` `author` ON
`orders`.`author_id` = `author`.`ID` //Автор товара
LEFT JOIN `users` `partner` ON
`orders`.`partner_id` = `partner`.`ID` //Партнер товара
INNER JOIN `products` ON `orders`.`product_id` = `products`.`id` //Товар заказа
WHERE
(
(
`author`.`is_statistic` = 1 AND
(
(`orders`.`partner_id` IS NOT NULL AND `partner`.`is_statistic` = 1)
OR `orders`.`partner_id` IS NULL
)
) //Включаем только те заказы, автор и партнер которых отображаются в статистике (is_statistic = 1)
)
AND `products`.`site_id` = '48'
AND `orders`.`status` = 'paid' //Включаем только оплаченные заказы
AND(
`orders`.`partner_id` NOT IN(
//Тут список id исключенных партнеров
) OR `orders`.`partner_id` IS NULL
)
Ниже приведу результат выполнения EXPLAIN EXTENDED этого запроса:
Прошу подсказать что можно придумать для ускорения