Нужно ли INDEX второй столбец для использования в предложении WHERE? - PullRequest
4 голосов
/ 05 марта 2012

Рассмотрим выборку данных с помощью

SELECT * FROM table WHERE column1='XX' && column2='XX'

Mysql отфильтрует результаты, соответствующие первой части предложения WHERE, а затем второй части.Я прав?

Представьте, что первая часть соответствует 10 записям, а добавление второй части фильтрует 5 записей.Нужно ли INDEX второй столбец тоже?

Ответы [ 4 ]

5 голосов
/ 05 марта 2012

Вы говорите о оценке короткого замыкания. СУБД имеет оптимизатор на основе затрат. нет гарантия того, что оба условия будут оценены первыми.

Чтобы применить это к вашему вопросу: Да, это может быть полезно для индексации вашего второго столбца.

  • Используется ли оно регулярно в поисках?
  • О чем говорит план выполнения?
  • Изменится ли схема доступа в ближайшем будущем?
  • Сколькозаписи, содержащиеся в таблице?
  • Будет ли лучше использовать индекс покрытия?
  • ...
4 голосов
/ 05 марта 2012

Индексы являются необязательными в MySQL, но они могут повысить производительность.

В настоящее время MySQL может использовать только один индекс на выбор таблицы, поэтому с данным запросом, если у вас есть индекс как для column1, так и для column2,MySQL попытается определить индекс, который будет наиболее выгодным, и использовать только один.

Общее решение, если скорость выбора имеет первостепенное значение, состоит в создании многостолбцового индекса, который включает в себяоба столбца.

Таким образом, несмотря на то, что MySQL может использовать только один индекс для таблицы, он будет использовать многостолбцовый индекс, в котором индексированы оба столбца, что позволяет MySQL быстро фильтровать оба критерия в предложении WHERE..

В многостолбцовом индексе вы бы сначала поместили столбец с наибольшим количеством элементов (наибольшее количество различных значений).

Для еще большей оптимизации "покрытие"в некоторых случаях могут применяться индексы .

Обратите внимание, что индексы могут повысить производительность, но с некоторыми затратами.Индексы увеличивают требования к памяти и памяти.Кроме того, при обновлении или вставке записей в таблицу соответствующие индексы требуют обслуживания.Все эти факторы должны учитываться при реализации индексов.

Обновление: Теперь MySQL 5.0 может использовать индекс для нескольких столбцов, объединяя результаты каждого индекса с несколькими предостережениями.

Следующий запрос является хорошим кандидатом для Оптимизация слияния индексов :

SELECT * FROM t1 WHERE key1=1 AND key2=1
2 голосов
/ 05 марта 2012

При обработке такого запроса СУБД будет использовать только один индекс.Наличие отдельных индексов в обоих столбцах позволит ему выбрать тот, который будет быстрее.

Требуется ли , зависит от вашей конкретной ситуации.

  • Является ли запросмедленнее, чем сейчас?
  • Было бы быстрее с индексом для другого столбца?
  • Было бы быстрее с одним индексом, содержащим оба столбца?

Вы можетенужно попытаться измерить несколько подходов.

1 голос
/ 05 марта 2012

Вам не нужно индексировать второй столбец, но это может ускорить ваш SELECT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...