индекс дальности mysql

У меня есть очень простой выбор, как это:

SELECT * FROM table 
  WHERE column1 IN (5, 20, 30);

на столбце1 установлен индекс, после объяснения запроса используется индекс, все выглядит нормально.

но если в диапазоне более трех значений, вот так:

  SELECT * FROM table 
      WHERE column1 IN (5, 20, 30, 40);

Индекс не используется, и выбор выполняется через все записи. Я делаю что-то неправильно? Спасибо

15.12.2008 10:59:21
1 ОТВЕТ
РЕШЕНИЕ

Сколько строк MySql считает в таблице?

Mysql часто (обычно правильно!) Предполагает, что будет быстрее выполнять последовательное сканирование строк, а не возиться с более сложным доступом через индекс.

Это варьируется от СУБД к СУБД, но точка компромисса составляет где-то около 30% строк.

IE. Если оптимизатор ожидает, что будет выбрано более 30% строк, он будет последовательно сканировать всю таблицу, поскольку это обычно быстрее, чем выполнение большого количества прямого доступа через индексы.

2
15.12.2008 11:11:15
Совершенно верно, что было бы неплохо периодически вычислять статические значения и после значительных изменений данных, чтобы оптимизатор принял правильное решение. +1
Dheer 15.12.2008 11:13:15
возможно в этом и проблема :) в таблице приведены только некоторые данные для тестирования, поэтому там всего около 30 строк.
Martin Rázus 15.12.2008 11:14:02