Можно ли выбрать по диапазону на крайнем левом множественном индексе? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть индекс m_idx на (k1,k2,k3)
Если я делаю
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
ИЛИ
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1 IN (500,1000,1500 ...) AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 999

НО, еслиЯ пытаюсь использовать диапазон на k1:
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1>=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 58035
Во всех случаях EXPLAIN говорит, что используется ключ m_idx
Но я думаю, что в третьем случае m_idx он не используется (у меня также есть индекс только для k1).
В противном случае я не понимаю, почему он читает более 1000 строк.
Я ожидал отсканировать m_idx index и ONLY the first 1000 строки, которые удовлетворяют условиям для чтения из таблицы.
Но на самом деле я думаю, что для третьего случая он сканирует индекс, и те строки, которые удовлетворяют условию k1, считываются из условий tb, а условия k2 и k3 проверяются послестроки читаются из tb.
Я использую: MySql с MyISAM, WINDOWS 7 64, tb имеет 1 мил строк;
Итак, мои вопросы:
Можно ли выбрать по диапазону на крайнем левом многоиндексном?
ИЛИ
Я делаю что-то еще не так?
Спасибо.

1 Ответ

0 голосов
/ 03 декабря 2010
  1. Нет, это не так.
  2. Нет, вы все делаете правильно

http://dev.mysql.com/doc/refman/5.1/en/range-optimization.html ("7.3.1.3.2. ДиапазонМетод доступа для составных индексов "part)

Таким образом, вы не можете помочь оптимизатору выполнить этот запрос быстрее.

И избегать использования FORCE INDEX, так как оптимизатор лучше знает, какой индекс использовать.

Также:

k1>=500 AND k2 IN(...) AND k2>2000

В зависимости от того, какая часть возвращает меньше записей, либо k1>=500, либо k2 IN(...) AND k2>2000 (я не уверен, зачем вам здесь > 2000, из-за васМожно сравнить его вручную, прежде чем добавить к IN()), вы также можете попытаться создать индекс k2 (если часть k2 возвращает меньшее количество записей).

...