2016-03-29 6 views
7

Per this comment есть по крайней мере 8 различных способов для выбора записей по годам и месяцам:Самый быстрый способ выбрать по году-месяцу?

  1. где дата, как '2005-01-%'
  2. где DATE_FORMAT (дата, '% Y-% м') = '2005-01'
  3. , где ЭКСТРАКТ (YEAR_MONTH от даты) = '200501'
  4. где год (дата) = '2005' и месяц (дата) = '1'
  5. , где подстроку (дата, 1 , 7) = '2005-01'
  6. где дата между '2005-01-01' и '2005-0 1-31 '
  7. , где дата> =' 2005-01-01 'и дата < =' 2005-01-31 '
  8. , где дата IN (' 2005-01-01 ',' 2005-01-02 ',' 2005-01-03 ',' 2005-01-04 ',' 2005-01-05 ',' 2005-01-06 ',' 2005-01-07 ',' 2005-01-08 ', '2005-01-09', '2005-01-10', '2005-01-11', '2005-01-12', '2005-01-13', '2005-01-14', '2005 -01-15 ',' 2005-01-16 ',' 2005-01-17 ',' 2005-01-18 ',' 2005-01-19 ',' 2005-01-20 ',' 2005-01 -21 ',' 2005-01-22 ',' 2005-01-23 ',' 2005-01-24 ',' 2005-01-25 ',' 2005-01-26 ',' 2005-01-27 », '2005-01-28', '2005-01-29', '2005-01-30', '2005-01-31')

который является самым быстрым в пункте в WHERE ? Который самый быстрый в GROUP BY? Может ли кто-нибудь из них воспользоваться индексом?

Мой конкретный запрос выглядит следующим образом:

select count(*) 
from quotes quote 
where EXTRACT(YEAR_MONTH FROM qtime) = :date 

Где qtime является TIMESTAMP.

Но я также должен получить месяц с наибольшим количеством цитат:

select date_format(qtime,'%Y-%m') d,count(*) c 
from quotes 
group by EXTRACT(YEAR_MONTH FROM qtime) 
order by c desc, qid asc limit 1; 

в этом случае я не могу использовать операторы сравнения.

+1

Я думаю, что число 6 довольно быстро. –

+0

он тоже выключен одним ... – thebjorn

+1

6 и 7 могут использовать индексы – Strawberry

ответ

5

Я анализирую все эти запросы и получил результат.

between => Showing rows 0 - 29 (158 total, Query took 0.0030 sec) 

like => Showing rows 0 - 29 (167 total, Query took 0.0031 sec) 

DATE_FORMAT => Showing rows 0 - 29 (167 total, Query took 0.0237 sec) 

EXTRACT => Showing rows 0 - 29 (167 total, Query took 0.0031 sec) 

YEAR, MONTH => Showing rows 0 - 29 (167 total, Query took 0.0187 sec) 

substr => Showing rows 0 - 29 (167 total, Query took 0.0224 sec) 

> < => Showing rows 0 - 29 (158 total, Query took 0.0030 sec) 

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

+1

Это хорошее представление о вашем тестировании. Между и меньше/больше, чем кажется, хорошо работают, поскольку практически нет преобразования данных. – zedfoxus

+0

Это хорошо, но эти цифры настолько малы. Мне интересно, что такое ошибка? EXTRACT и LIKE почти так же быстро, как BETWEEN, а '<>' - это накладные расходы, действительно, небольшие? Я могу видеть, как «LIKE» все еще может использовать индекс, так как он запускается с запросом, но также ЭКСТРАКТ тайно оптимизирован? – mpen

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