У меня есть индекс 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 мил строк;
Итак, мои вопросы:
Можно ли выбрать по диапазону на крайнем левом многоиндексном?
ИЛИ
Я делаю что-то еще не так?
Спасибо.