Медленно, чтобы получить максимальные и минимальные значения, связанные с параметрами каждой строки - PullRequest
1 голос
/ 22 марта 2011

Мне нужно получить определенные отслеживаемые данные, включая пару макс. И мин. У меня уже есть ужасный способ сделать это ниже, но, как вы знаете, это ДЕЙСТВИТЕЛЬНО медленно, потому что я использую подзапросы, а таблица содержит пару тысяч строк. В частности, мне нужно получить разные значения MAX для каждой строки, в зависимости от type_dev текущей строки. с 24000 записей это становится непригодным для использования, и я думаю, что это даже медленнее, когда я пытаюсь вместо этого использовать предложения MAX.

SELECT dt.some_data, dt.date_visit, dt.url, 
      (SELECT date_visit FROM device_tracker 
       WHERE type_dev = dt.type_dev ORDER BY date_visit DESC LIMIT 1) last_visit,
      (SELECT date_visit FROM device_tracker 
       WHERE type_dev = dt.type_dev and url = dt.url ORDER BY date_visit DESC LIMIT 1) last_visit_to_this_url 
   FROM device_tracker dt WHERE some_where_clauses;

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

Мне нужно то же самое с минимальными датами.

Конечно, есть много хороших способов сделать это. Может ли кто-нибудь пролить свет на это?

1 Ответ

1 голос
/ 22 марта 2011
SELECT  *
FROM    (
        SELECT  type_dev, MAX(date_visit) AS maxt, MIN(date_visit) AS mint
        FROM    device_tracker
        GROUP BY
                type_dev
        ) t
JOIN    (
        SELECT  type_dev, url, MAX(date_visit) AS maxtu, MIN(date_visit) AS mintu
        FROM    device_tracker
        GROUP BY
                type_dev, url
        ) tu
ON      tu.type_dev = t.type_dev
JOIN    device_tracker dt
ON      dt.type_dev = tu.type_dev
        AND dt.url = tu.url

Создайте составной индекс на (type_dev, url, date_visit), чтобы это работало быстро.

...