Нужно индексировать столбец в операторе AND? - PullRequest
0 голосов
/ 18 февраля 2011

Я должен сделать SELECT для таблицы следующим образом:

  • id
  • имя пользователя
  • скорость
  • is_running

Оператор выглядит так:

SELECT * 
  FROM mytable 
 WHERE username = 'foo' 
   AND is_running = 1

У меня есть индекс "username".Если я выполняю вышеприведенный оператор, нужно ли также индексировать is_running для лучшей производительности?Или только первый столбец выбора имеет значение?Я использую mysql 5.0.

Ответы [ 3 ]

1 голос
/ 18 февраля 2011

Это зависит от типа данных, которые вы храните. Если это bool, вы можете не увидеть выигрыш от индекса только по этому столбцу. Вы можете попытаться добавить составной индекс по двум столбцам:

ALTER TABLE mytable ADD INDEX `IDX_USERNAME_IS_RUNNING` ( `username` , `is_running` );
0 голосов
/ 18 февраля 2011

Если у вас есть таблица с 1 миллионом пользователей, и одновременно работает только 1 или 2 - обязательно индексируйте по is_running, и это даст вам фантастическую производительность. В этом конкретном случае лучше всего иметь 2 индекса по отдельности для столбцов - имя пользователя, isrunning. Причина для двух индексов заключается в том, что вы запрашиваете is_running=0, в этом случае вместо него используется индекс username.

В противном случае, есть вероятность того, что составной индекс (% имя пользователя, isrunning) поможет 0%. Придерживайтесь одного индекса на имя пользователя.

Наконец, тебе действительно нужна целая запись? Выбрать *? В некоторых сценариях, близких к tipping point (когда MySQL считает индекс + поиск становится менее эффективным, чем прямое сканирование), вы можете сделать этот запрос более быстрым, чем оригинал. Иметь индекс (имя пользователя, идентификатор)

SELECT mytable.*
FROM (
SELECT id 
  FROM mytable 
 WHERE username = 'foo' 
   AND is_running = 1
) X
INNER JOIN mytable on mytable.id = X.id
0 голосов
/ 18 февраля 2011

В конечном итоге это будет зависеть от количества данных в таблице относительно того, требуется ли вам индекс.Во многих случаях движок может просто выполнить сканирование таблицы и вообще не указывать ваш индекс, если считает, что это быстрее.У вас есть 100 пользователей или 100 000 пользователей?

В столбце бит / bool вы не собираетесь использовать тонну дискового пространства для индекса, поэтому, вероятно, это не повредит, если у вас действительно высокийСкорость вставки.

...