Увеличение производительности MySQL Query - Math тяжелый запрос - PullRequest
0 голосов
/ 11 января 2012

Кто-нибудь готов помочь мне с этим?Следующий запрос занимает около 18 секунд для таблицы MEMORY с 10000 строками.Если у меня нет ограничения «где», это займет чуть меньше минуты.Я включил кеширование запросов и пробовал его как подготовленное утверждение.Что я могу сделать?Индексы или что нет?

SELECT SQL_CACHE
date(todaydata.postdate) as postdate,
SUM(CASE when todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) AS INFLOW,
SUM(CASE when todaydata.amount < 0 THEN todaydata.amount ELSE 0 END) AS OUTFLOW
FROM invoice as todaydata
LEFT JOIN invoice as yesterdaydata ON todaydata.postdate=DATE_ADD(yesterdaydata.postdate,interval -1 day)
where todaydata.postdate between now() - interval 2 month and now() + interval 1 month
GROUP BY date(todaydata.postdate)

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Я думаю, что это даст вам то, что вы хотите с любым изменяющимся диапазоном дат, который вас интересует ... Я проверил, создав свою собственную таблицу "счетов-фактур" с двумя указанными столбцами.На самом деле все было довольно просто с использованием переменных @ mySQL, которые можно использовать встроенными в запросе ... Единственное, теперь есть верный способ узнать, что такое "начальный" баланс, поэтому я установил начальныйначальное значение ноль, а затем отрегулируйте его.

Кикер - это запрос «PreAgg», который просто агрегирует по самой дате ввода / вывода.Затем, упорядочивая этот результат в порядке дат, включается переменная @ sql.

select
      PreAgg.PostDate,
      @PrevBal as BegBal,
      PreAgg.OutFlows,
      PreAgg.InFlows,
      @PrevBal := @PrevBal + PreAgg.OutFlows + PreAgg.InFlows as EndBal
   from 
      ( select
              i.postdate,
              sum( if( i.amount < 0, i.amount, 0 ) ) as OutFlows,
              sum( if( i.amount > 0, i.amount, 0 ) ) as InFlows
           from 
              invoice i
           where
              i.postdate between date_sub( now(), interval 2 month )
                             and date_add( now(), interval 1 month )
           group by
              i.postdate
           order by 
              i.postdate ) as PreAgg,
      ( select @PrevBal := 0.00 ) as SqlVars

Однако, хотя я и дал 3-месячное окно (-2 месяца, +1 месяц), я надеваюНе думаю, что это действительно имеет смысл, так как будущие публикации еще не произошли ... что может быть важнее, просто иметь

       where
          i.postdate > date_sub( now(), interval 3 month )

, который получит последние 3 месяца с текущей даты / времени.

0 голосов
/ 11 января 2012
  1. Поверните LEFT JOIN в INNER JOIN.
  2. Лучше использовать что-то вроде Memcached вместо кеша MySQL.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...