Расчет среднего (AVG) и группировка по неделям для большого набора данных занимает слишком много времени - PullRequest
0 голосов
/ 10 апреля 2010

Я получаю средние цены за неделю на 7 миллионов строк, для выполнения работы требуется около 30 секунд.

Это простой запрос:

SELECT AVG(price) as price, yearWEEK(FROM_UNIXTIME(timelog)) as week from pricehistory where timelog > $range and product_id = $id GROUP BY week

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

Ответы [ 2 ]

1 голос
/ 10 апреля 2010

Я бы предложил создать новый составной индекс BTREE (product_id, timelog) и изменить порядок условий в предложении WHERE:

SELECT
    AVG(price) as price,
    yearWEEK(FROM_UNIXTIME(timelog)) as week
from pricehistory
where product_id = $id AND timelog > $range 
GROUP BY week

Если у вас уже есть индекс BTREE только (product_id), просто увеличьте его до (product_id, timelog)

1 голос
/ 10 апреля 2010

Вы пробовали индексировать поля?

Я не эксперт по DDL в MySQL, но в этом случае я бы сказал, что timelog должен иметь кластеризованный индекс, тогда некластерные индексы должны быть объявлены для product_id. Также было бы неплохо добавить в таблицу новое поле для хранения значения «недели» и индексировать его. Это заняло бы немного больше места, но таким образом вы не будете делать одни и те же вычисления каждый раз.

...