SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.09.2010 23:20:53

arvitaly
Участник
Зарегистрирован: 08.09.2010
Сообщений: 4

Индексы при date_format и susbtr

В базе хранится дата в формате datetime, в запросе нужно использовать только дату (без времени). Используется в конструкции group by. Использую функцию date_format(dt,'%y-%m-%d'), и время выполнения запроса увеличивается в двое. Explain показывает что mysql использует индекс и с date_format и без.

Каким нибудь образом можно оптимизировать такой запрос?

Неактивен

 

#2 08.09.2010 23:45:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Индексы при date_format и susbtr

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

Неактивен

 

#3 09.09.2010 12:42:21

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Индексы при date_format и susbtr

А не прокатит тут
LEFT(dt, 10) ?

"2010-09-09 10:40"    -> LEFT(dt, 10) -> "2010-09-09"

Все таки первые символы строки. Если формат ДатаВремя хранится как строка.

Неактивен

 

#4 11.09.2010 13:37:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Индексы при date_format и susbtr

Ну, если хранить как строку, то можно попробовать. Только не функцией,
а сравнением: WHERE dt LIKE '2010-09-09%'. Но это, мягко сказать, не
самый эффективный способ хранения дат smile

Неактивен

 

#5 13.09.2010 12:05:31

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Индексы при date_format и susbtr

Нет нет речь как раз о DATETIME типе.

Попрыгал я тут вокруг с бубном, заметил следуюшее:
Для:


CREATE TABLE IF NOT EXISTS `t1` (
  `dt` datetime NOT NULL,
  KEY `dt` (`dt`)
) ENGINE=MyISAM ;
 

Запросы:
EXPLAIN SELECT * FROM `t1` WHERE `dt` = '2010-09-06'
EXPLAIN SELECT * FROM `t1` WHERE `dt` > '2010-09-06'
EXPLAIN SELECT * FROM `t1` WHERE `dt` BETWEEN '2010-09-06' AND '2010-09-07'
 
дают использование индекса:
key     key_len
dt    8

а запрос:
EXPLAIN SELECT * FROM `t1` WHERE `dt` LIKE '2010-09-06%'
 
не использует его
key     key_len
NULL    NULL

Отредактированно vaspet (13.09.2010 12:28:54)

Неактивен

 

#6 13.09.2010 12:23:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Индексы при date_format и susbtr

Я же сказал хранить как строку wink
Разумеется, число нельзя сравнивать строковыми операторами.

Неактивен

 

#7 13.09.2010 12:40:06

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Индексы при date_format и susbtr

datetime хранится как число?

Неактивен

 

#8 13.09.2010 13:59:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Индексы при date_format и susbtr

Угу. К тому же — дробным числом wink
http://en.wikipedia.org/wiki/Double_precision

Целая часть — количество дней с нуля (не epoch!). Дробная — ну, честная
дробь. Т.е. 0.5 ~ 12 часов smile

Неактивен

 

#9 13.09.2010 15:53:02

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Индексы при date_format и susbtr

Интересно.


SET @a = STR_TO_DATE('2010-01-31', '%Y-%m-%d');
SET @b = STR_TO_DATE('2010-02-00', '%Y-%m-%d');
SET @c = STR_TO_DATE('2010-02-01', '%Y-%m-%d');

#"Нулевое февраля" лежит между 31 января и первым февраля (строго)
#является правда так-же как 31 янв. - воскресеньем и 31 днем года.

SELECT @a, @b, @c, @a<@b<@c, DATE_FORMAT(@a, '%j, %w, %W'), DATE_FORMAT(@b, '%j, %w, %W')
 

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson