MySQL DateTime объединяет две большие таблицы

У меня есть две таблицы, и я хочу объединить их и суммировать некоторые столбцы. Критерием соединения должно быть то, что время таблицы A находится в пределах 1 и 5 минут от времени таблицы B.

Итак, B.time ‹= A.time ‹= B.time + (1|5) минут.

Вот код, и у меня есть индексы (btree) для обоих столбцов даты и времени. Но, похоже, он работает СУПЕР МЕДЛЕННО. Что-то я могу сделать по-другому?

SELECT
    a.Name,
    SUM(b.UnitsSold),
    SUM(b.Revenue),
    SUM(c.UnitsSold),
    SUM(c.Revenue)
FROM cars a
INNER JOIN sales b
ON
    b.Datet <= a.Datet
    and a.Datet <= DATE_ADD(b.Datet, INTERVAL 1 MINUTE)
INNER JOIN sales c
ON
    c.Datet <= a.Datet
    and a.Datet <= DATE_ADD(c.Datet, INTERVAL 5 MINUTE)
GROUP BY
    a.name

person Karly1337    schedule 28.06.2018    source источник
comment
Запросы неравенства очень медленные. Я бы посоветовал вам задать вопрос с примерными данными, желаемыми результатами и более полным объяснением желаемой логики.   -  person Gordon Linoff    schedule 28.06.2018
comment
Я согласен с @Gordon Linoff в том, что вам было бы намного проще помочь, если бы вы предоставили образцы данных и образец желаемого результата. При этом ваш код выглядит вполне законным, но серверу приходится выполнять 8 вычислений для каждой записи (а также два внутренних соединения). Так что, особенно если мы говорим о тысячах записей, неудивительно, что он работает медленно. Можете ли вы ограничить количество включенных записей с помощью простого предложения WHERE (например, WHERE date ›= 01.01.2018)? Это помогло бы, поскольку обработчик запросов может исключить соответствующие записи до того, как будут выполнены другие вычисления.   -  person SeanW333    schedule 28.06.2018


Ответы (1)


Как упоминалось ранее, без примеров данных, желаемых результатов и объяснения логики того, что вам нужно, трудно помочь, но вот потенциальное решение, которое вы можете попробовать:

Создайте два новых столбца в таблице продаж (Datet_b и Datet_c) и при вставке/обновлении запустите функцию DATE_ADD, чтобы заполнить их.

Добавьте индексы для этих двух столбцов, а затем запустите приведенный выше запрос без функции DATE_ADD.

Запустите запрос, и производительность должна стать немного лучше.

person Will Jones    schedule 28.06.2018