Индексы и порядок MySQL

Это вопрос, который я имел навсегда.

Насколько мне известно, порядок индексов имеет значение. Таким образом, индекс, такой как [first_name, last_name] , не совпадает с [last_name, first_name] , правильно?

Если я определяю только первый индекс, значит ли это, что он будет использоваться только для

 SELECT * FROM table WHERE first_name="john" AND last_name="doe"; 

и не для

 SELECT * FROM table WHERE last_name="doe" AND first_name="john"; 

Поскольку я использую ORM, я понятия не имею, в каком порядке эти столбцы будут вызываться. Означает ли это, что мне нужно добавлять индексы во все перестановки? Это выполнимо, если у меня есть индекс с двумя столбцами, но что произойдет, если мой индекс находится на 3 или 4 столбцах?

Указательный порядок имеет значение, когда условия вашего запроса применимы только к ЧАСТИ индекса. Рассматривать:

  1. SELECT * FROM table WHERE first_name="john" AND last_name="doe"

  2. SELECT * FROM table WHERE first_name="john"

  3. SELECT * FROM table WHERE last_name="doe"

Если ваш индекс ( first_name , last_name ), запросы 1 и 2 будут использовать его, запрос №3 не будет. Если ваш индекс ( last_name , first_name ), запросы 1 и 3 будут его использовать, запрос №2 не будет. Изменение порядка условий в предложении WHERE не имеет никакого эффекта в обоих случаях.

Подробности здесь

Обновление :
В случае, если выше не ясно – MySQL может использовать только индекс, если столбцы в условиях запроса образуют самый левый префикс индекса. Запрос № 2 выше не может использовать ( last_name , first_name ) индекс, потому что он основан только на first_name а first_name НЕ является крайним левым префиксом индекса ( last_name , first_name ).

Порядок условий в запросе не имеет значения; запрос # 1 выше сможет использовать ( last_name , first_name ) индекс просто отлично, потому что его условия являются first_name и last_name и, вместе взятые, они образуют самый левый префикс индекса ( last_name , first_name ).

ChssPly76 правильно, что порядок булевых выражений не должен соответствовать порядку столбцов в индексе. Булевы операторы являются коммутативными , а оптимизатор MySQL достаточно умен, чтобы знать, как в большинстве случаев сопоставить выражение с индексом.

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

Почему бы не расширить ответ немного, чтобы сразу сделать абсолютно все кристально чистым.

Если таблица имеет индекс с несколькими столбцами, любой левый префикс индекса может использоваться оптимизатором для поиска строк. Например, если у вас есть индекс с тремя столбцами (col1, col2, col3) , у вас есть индексированные возможности поиска в (col1) , (col1, col2) и (col1, col2, col3) .

MySQL не может использовать индекс, если столбцы не образуют крайний левый префикс индекса. Предположим, что у вас есть инструкции SELECT, показанные здесь:

 SELECT * FROM tbl_name WHERE col1=val1; SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; SELECT * FROM tbl_name WHERE col2=val2; SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3; 

Если индекс существует (col1, col2, col3) , то только первые два запроса используют индекс. Третий и четвертый запросы include индексированные столбцы, но (col2) и (col2, col3) не являются (col2, col3) префиксами (col1, col2, col3) . – MySQL dev

  • Заказ MySQL перед Группой
  • Монгоский порядок по длине массива
  • Пользовательская логика сортировки в OrderBy с использованием LINQ
  • Как SQL Server сортирует ваши данные?
  • Используйте собственный IComparer с Linq OrderBy
  • Заказ строк по умолчанию для выбора запроса в oracle
  • Множественный «порядок по» в LINQ
  • Как я могу заказать базу данных SQLITE в порядке убывания, для приложения для Android?
  • Медленный запрос при использовании ORDER BY
  • MySQL Orderby число, Nulls last
  • Сортировка столбца строки, содержащего числа в SQL?
  • Interesting Posts

    Сортировка ArrayList объектов с использованием пользовательского порядка сортировки

    Почему этот расчет с плавающей запятой дает разные результаты на разных машинах?

    Когда Java Thread.sleep запускает InterruptedException?

    jqGrid – сохранение выбранного флажка

    Запуск сразу нескольких конфигураций запуска

    Проверьте, существует ли файл с шаблоном в сценарии оболочки

    Можно ли использовать компьютер с двумя процессорами в качестве рабочего стола?

    Как связать несколько экземпляров Firefox с моей панелью задач?

    Можем ли мы импортировать XML-файл в другой файл XML?

    Получение кода состояния Http (200, 301, 404 и т. Д.) Из HttpWebRequest и HttpWebResponse

    Получить атрибут annotations Java

    Что означают префиксы E и R в именах 32-битных и 64-битных регистров Intel?

    Отображать мягкую клавиатуру iPhone, даже если подключена аппаратная клавиатура

    Регулярное выражение противоположно

    Аргументы для основного в C

    Давайте будем гением компьютера.