Индекс для операции BETWEEN в MySql

У меня есть несколько таблиц в MySQL, в которых хранятся хронологические данные. Я добавил индекс покрытия для этих таблиц с полем даты в конце. В своих запросах я выбираю данные за некоторый период, используя операцию BETWEEN для поля даты. Итак, мой оператор WHERE состоит из всех полей из покрывающего индекса.

Когда я выполняю запрос EXPLAIN в столбце Extra, у меня есть «Используя где» - так что, как я думаю, это означает, что это поле даты не ищется в индексе. Когда я выбираю данные за один период — я использую операцию «=» вместо МЕЖДУ, и «Использование где» не появляется — все ищутся в индексе.

Что я могу сделать, чтобы все мои операторы WHERE искались в индексе, содержащем операцию BETWEEN?

ОБНОВЛЕНИЕ:

структура таблицы:

CREATE TABLE  phones_stat (
  id_site int(10) unsigned NOT NULL,
  group smallint(5) unsigned NOT NULL,
  day date NOT NULL,
  id_phone mediumint(8) unsigned NOT NULL,
  sessions int(10) unsigned NOT NULL,
  PRIMARY KEY (id_site,group,day,id_phone) USING BTREE
) ;

запрос:

SELECT id_phone, 
       SUM(sessions) AS cnt 
  FROM phones_stat 
 WHERE id_site = 25 
   AND group = 1 
   AND day BETWEEN '2010-01-01' AND '2010-01-31' 
GROUP BY id_phone 
ORDER BY cnt DESC

person hippout    schedule 01.02.2010    source источник
comment
Вы проверили, произойдет ли то же самое, если вы используете ›= и ‹= ? Какая версия MySql?   -  person My Other Me    schedule 01.02.2010
comment
я пробовал выполнить запрос всего одной › операцией, ситуация не меняется. i;, используя сервер mysql 5.1   -  person hippout    schedule 01.02.2010
comment
Вставьте всю схему задействованных таблиц, запрос и план объяснения. BETWEEN должен иметь возможность сканировать диапазон индекса, который начинается с задействованного поля, если только оптимизатор не решит, что есть лучший способ.   -  person MarkR    schedule 01.02.2010


Ответы (2)


Сколько у вас рядов? Иногда индекс не используется, если оптимизатор считает его ненужным (например, если количество строк в вашей таблице (таблицах) очень мало). Не могли бы вы дать нам представление о том, как выглядит ваш SQL?

Вы можете попробовать намекнуть на использование вашего индекса и посмотреть, что вы получаете в EXPLAIN, просто чтобы подтвердить, что ваш индекс игнорируется, например.

http://dev.mysql.com/doc/refman/5.1/en/optimizer-issues.html

person davek    schedule 01.02.2010
comment
мой индекс используется, но не весь, он покрывает - поэтому он состоит из 3 полей с полем даты в конце. - person hippout; 01.02.2010

Если вы группируете по id_phone, то более полезным будет тот индекс, который начинается с этого, т.е.

... PRIMARY KEY (id_phone, id_site, `group`, day) USING BTREE

Если вы измените индекс на этот и перезапустите запрос, поможет ли это?

person Vince Bowdren    schedule 03.02.2010