2013-04-22 3 views
1

У меня есть следующая таблица:ускорить мой MySQL заявление

+---------------------+-------+ 
| t     | price | 
+---------------------+-------+ 
| 2013-04-22 13:23:51 | 9.42 | 
+---------------------+-------+ 

где Т типа метка время и цена поплавок.

Стол большой и около 500 тыс. Рядов.

Задача:

Я собираюсь показать таблицу и цену MIN прошлых 3-х дней для каждой строки.

Так что я написал следующее:

select *,(
    select max(b.price) 
    from my_table b 
    where b.t<a.t and date(b.t)>=adddate(date(a.t),-3) 
) from my_table a; 

Проблема заключается в том, что она Невер завершить мой запрос, и, похоже, она повесила .... Есть ли способ speeed до запроса? Или я сделал что-то не так?

+1

У вас есть 'index' на' timestamp'? Это поможет значительно –

+0

Да, у меня есть t как индекс. – kido9797

ответ

0

Я думаю, что ваша функция adddate может быть неправильной. Попробуйте использовать его как это: ADDDATE (в, ИНТЕРВАЛ -3 DAY)

+0

Я просто попробовал еще раз с гораздо меньшим количеством строк, но скорость также прошивается: mysql> выберите count (*) из my_table, где date (t) = date (now()); + ---------- + | count (*) | + ---------- + | 634 | + ---------- + mysql> SELECT at, a.price, (SELECT MAX (b.price) FROM my_table b WHERE bt МЕЖДУ на - INTERVAL 3 DAY и at - INTERVAL 1 SECOND) from my_table a WHERE date (t) = date (now()); – kido9797

+0

Вы не можете присоединиться к таблицам a и b вместе? В основном это похоже на то, что вы хотите захватить все данные из каждой таблицы и поместить их в одну таблицу, но sql не знает, как ее совместить. Я бы попытался присоединиться, а затем сделать select *, max (b.price) from ...... –

0

Я хотел бы попробовать это:

select *,(
    select max(b.price) 
    from my_table b 
    where b.t between a.t - interval 3 day and a.t - interval 1 second 
) from my_table a; 

и убедитесь, что my_table.t имеет индекс:

alter table my_table add index ix_t (t); 
+0

Hi Ross, Спасибо за ваш ответ, я добавил индекс в таблицу, но все же время работы занимает возраст (больше чем 15 минут, и я, наконец, пришлось его разбить) ..... Итак, любые другие решения, которые будут работать быстрее? – kido9797

0

Этот запрос должны работать быстро:

SELECT *, 
    ( SELECT max(b.price) 
     FROM my_table b 
     WHERE b.t > a.t - interval 3 day 
      AND b.t < a.t 
    ) 
FROM my_table a 

но вы должны убедиться, что у вас есть индекс по mytable(t) - Я полагаю, что это фи eld - timestamp или datetime.

+0

Спасибо, пожалуйста, см. Мой ответ ниже, все еще не решен. – kido9797

Смежные вопросы