Оптимизация 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 этого запроса: введите сюда описание изображения Прошу подсказать что можно придумать для ускорения


Ответы (0 шт):