Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: hippoutОтветов: 2

У меня есть несколько таблиц в 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
  • Вы проверили, произойдет ли то же самое, если вы используете ›= и ‹= ? Какая версия MySql? My Other Me 01.02.2010
  • я пробовал выполнить запрос всего одной › операцией, ситуация не меняется. i;, используя сервер mysql 5.1 hippout 01.02.2010
  • Вставьте всю схему задействованных таблиц, запрос и план объяснения. BETWEEN должен иметь возможность сканировать диапазон индекса, который начинается с задействованного поля, если только оптимизатор не решит, что есть лучший способ. MarkR 01.02.2010

indexing

Ответы

Ответ 1 · рейтинг 3 · davek

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

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

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

Ответ 2 · Vince Bowdren

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы