Mysql Оптимизировать запрос: пытается получить среднее значение подзапроса - PullRequest
1 голос
/ 13 апреля 2011

У меня следующий запрос:

SELECT AVG(time) FROM 
(SELECT UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time
    FROM table
    WHERE id IN 
        (SELECT DISTINCT id
            FROM table
            WHERE product_id = 12394 AND datelast > '2011-04-13 00:26:59'
        )
GROUP BY id
)
as T

Запрос получает наибольшее значение даты и вычитает его из наибольшего значения даты начала для каждого идентификатора (который является продолжительностью сеанса пользователя), а затем усредняет его.

Самый внешний запрос выполняется только для усреднения полученного времени. Есть ли способ оптимизировать этот запрос?

Вывод из EXPLAIN:

id  select_type         table       type            possible_keys           key     key_len ref     rows    extra
1   PRIMARY             <derived2>  ALL             NULL                    NULL    NULL    NULL    7   
2   DERIVED             table       index           NULL                    id      16      NULL    26      Using where
3   DEPENDENT SUBQUERY  table       index_subquery  id,product_id,datelast  id      12      func    2       Using index; Using where

1 Ответ

0 голосов
/ 14 апреля 2011

Действительно ли необходим первый SELECT?

SELECT
  AVG(time)
FROM 
(
  SELECT
    UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time
  FROM
    table
  WHERE
    product_id = 12394 AND datelast > '2011-04-13 00:26:59'
  GROUP BY
    id
)

Я не могу сейчас проверить, и я думаю, что это тоже сработает. В противном случае ваш запрос выглядит хорошо.

Вы можете оптимизировать запрос, добавив ключ (datelast, product_id) (всегда ставьте наиболее ограничивающее поле первым, чтобы повысить селективность).

...