Быстрый запрос при выполнении по отдельности, медленный при вложении - PullRequest
0 голосов
/ 22 сентября 2011

Я пытаюсь найти самое последнее время входа в кучу конкретных дат. Когда я бегу

select max(ts) as maxts from factorprice where ts <= '2011-1-5'

Возвращается очень быстро.

EXPLAIN дает select_type SIMPLE и «Выбирать оптимизированные таблицы».

Но когда я бегу

select (select max(ts) from factorprice where ts <= dates.dt) as maxts, dates.dt 
   from 
   trends.dates where dates.dt in ('2011-1-6');

Возвращение занимает много времени (~ 10 секунд).

Объяснение дает:

  • select_type = PRIMARY table = строки дат = 506 Extra = Использование где
  • select_type = DEPENDENT SUBQUERY table = factorprice type = index возможный_ключ = первичный ключ = первичный ключ = 8 строк = 26599224 Дополнительно = использование где; Использование индекса

Этот запрос также занимает много времени (10 секунд)

select dt, max(ts) as maxts from factorprice as f inner join trends.dates as d
   where ts <= dt and dt in ('2011-1-6')
   group by dt;

Объяснение дает:

  • select_type = SIMPLE таблица = тип d = ВСЕ строки = 509 Дополнительно = Использование где
  • select_type = SIMPLE table = f type = range возможный_keys = PRIMARY key = PRIMARY keylen = 8 строк = 26599224 Дополнительно = Использование где; Использование индекса

Я бы хотел сделать эту же операцию в разные дни. Есть ли способ, которым я могу сделать это эффективно?

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Похоже, эта ошибка:

http://bugs.mysql.com/bug.php?id=32665

Возможно, если вы создадите индекс для date.dt, он исчезнет.

0 голосов
/ 23 сентября 2011

Судя по вашему выводу EXPLAIN.Этот запрос посещает 506 строк в таблице дат, а затем для каждой из этих строк более 26 миллионов строк в таблице factorprice.10 секунд, чтобы сделать все это не так уж плохо.

Я предполагаю, что вы случайно создали ситуацию CROSS JOIN, в которой каждая строка в одной таблице сопоставляется с каждой строкой в ​​другой таблице.

0 голосов
/ 22 сентября 2011

Эта часть вашего SQL является зависимым запросом

select max(ts) from factorprice where ts <= dates.dt

, который выполняется для каждой строки в наборе результатов. Таким образом, общее время примерно равно времени автономного запроса, умноженному на строки в наборе результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...