Влияет ли порядок столбцов индекса в (у меня индекс из 6 столбцов) на скорость?

У меня есть таблица с 6 миллионами строк, мне нужно найти шесть столбцов, чтобы выбрать элементы. Итак, я создал индекс с шестью столбцами.

Влияет ли изменение порядка столбцов в индексе на скорость запроса?

Зависит ли скорость запроса от количества уникальных элементов в каждом столбце? или общее количество возможных результатов, которые имеет условие в столбце?

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

таблица: pic_tag_relations

Столбцы:

  • tag_id (int) (1-1000000) (количество элементов: наименьшее)
  • контраст_скоре (с плавающей запятой) (0-24)
  • quality_score (с плавающей запятой) (0-10)
  • pic_ratio_type (tinyint) (0/1/2)
  • is_okay (крошечный) (0/1)
  • уже_использованное_count (целое число) (1-10)

Запрос:

select * from pic_tag_relations where tag_id in ($all_tag_ids) && contrast_score>2.5 && quality_score>3 && is_okay=1 && pic_ratio_type='2' && already_used_count<10

Вероятно, лучше всего сначала иметь индекс с наивысшей мощностью.

Barmar 05.04.2021 17:56

Да, эффект действительно сильный. Пожалуйста, добавьте к вопросу запросы, которые вы будете выполнять.

The Impaler 05.04.2021 17:56

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

Tim Biegeleisen 05.04.2021 17:56

Сначала столбцы с более высокой «селективностью».

The Impaler 05.04.2021 17:57

@Barmar Не могли бы вы объяснить почему?

Mr poppins 05.04.2021 17:59

Моим первым побуждением было сказать: индекс - это индекс, независимо от того, как он был построен. Но руководство просит отличаться: «Если вы укажете столбцы в правильном порядке в определении индекса, один составной индекс может ускорить выполнение нескольких видов запросов к одной и той же таблице».

KIKO Software 05.04.2021 18:00

@TimBiegeleisen Я придерживаюсь того же мнения, что и вы, сначала отфильтруйте большинство результатов ... Я бы хотел прочитать, чтобы кто-нибудь объяснил это лучше, чем я представлял

Mr poppins 05.04.2021 18:01

@KIKOSoftware «несколько видов запросов» относится к запросам, которые определяют разные наборы столбцов для сопоставления.

Barmar 05.04.2021 18:01

@Barmar: да, верно, но в нем говорится, что порядок столбцов имеет значение.

KIKO Software 05.04.2021 18:02

@KIKOSoftware Потому что запрос, который пропускает некоторые столбцы в порядке, не сможет воспользоваться полным индексом. Но вопрос в запросах, в которых используются все столбцы.

Barmar 05.04.2021 18:03

@Barmar: Я знаю об этом.

KIKO Software 05.04.2021 18:04

@KIKOSoftware порядок индекса должен соответствовать порядку столбцов, упомянутых в запросе?

Mr poppins 05.04.2021 18:05

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

KIKO Software 05.04.2021 18:06

@KIKOSoftware да, это я тоже понимаю, спасибо за разъяснения. Как сказал Бармар, руководство, возможно, относится к использованию первых (1/2/3) столбцов, используемых в индексе, вместо того, чтобы пропускать порядок и запрашивать столбцы между ними в порядке индекса

Mr poppins 05.04.2021 18:10

@NicoHaase да, у меня такой же вопрос, больше столбцов в индексе, я ищу ответы, спасибо

Mr poppins 05.04.2021 18:24

@NicoHaase Этот вопрос значительно отличается от индекса из двух столбцов, к которому обращается официальное руководство MySQL, он также использует несколько операторов, что стоит оставить как отдельный вопрос

Mr poppins 05.04.2021 18:34
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
16
32
2

Ответы 2

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

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

Гораздо важнее, чтобы столбцы в индексе с условиями равенства были первыми столбцами (в любом порядке), чтобы индекс использовался эффективно.

Ах, понятно, спасибо, это определенно помогает. Я выполняю 3 сравнения (<условие) в запросе. Следует ли поместить эти столбцы в конец индекса?

Mr poppins 05.04.2021 18:07

@Mrpoppins. . . Столбцы с условиями равенства должны быть первыми. Затем следует самый строгий из столбцов >.

Gordon Linoff 05.04.2021 18:50

Я ответил примерно на тот же вопрос здесь: Имеет ли значение порядок полей многостолбцового индекса в MySQL

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

Если все условия вашего запроса - это сравнения =, то порядок столбцов не имеет большого значения. Некоторые люди пытаются выполнить микрооптимизацию, помещая более селективные столбцы слева, но я считаю, что это не имеет существенного значения.

Например, если вы ищете кого-то в телефонной книге по его полному имени, разве вас действительно волнует, отсортирована ли книга по фамилии или имени? В любом случае вы собираетесь фильтровать оба поля.

Но если у вас есть сочетание сравнений = и других типов операторов сравнения, то порядок столбцов действительно имеет значение.

В принципе, у вас может быть столько терминов =, сколько вы хотите, и столбцы для этих сравнений должны находиться в левом конце списка столбцов в индексе. Тогда вы можете иметь столбец ОДИН в индексе для сравнения неравенства. Любые другие столбцы, в которых вы выполняете поиск, не будут использовать индекс.

Вы упомянули в комментарии, что у вас есть запрос с 3 сравнениями с <. Как это:

... WHERE a < 1 AND b < 2 AND c < 3

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

Если используются термины =:

... WHERE a = 1 AND b = 2 AND c = 3

Тогда все столбцы многостолбцового индекса на (a, b, c) могут помочь в поиске, и порядок столбцов не будет иметь значения.

Если у вас было несколько сравнений:

... WHERE a = 1 AND b < 2 AND c < 3

Тогда у вас может быть указатель с a в крайнем левом столбце и один из b или c после него. Но если бы у вас были и b, и c, для поиска по-прежнему использовался бы только один - первый, следующий за a.

См. Мою презентацию Как правильно разрабатывать индексы или видео.


Повторите свой обновленный вопрос с помощью примера запроса:

select * from pic_tag_relations where tag_id in ($all_tag_ids) && contrast_score>2.5 && quality_score>3 && is_okay=1 && pic_ratio_type='2' && already_used_count<10

У вас может быть индекс с (is_okay, pic_ratio_type) в качестве первых столбцов, а затем вы можете выбрать, какой из других столбцов должен быть третьим столбцом. Ссылки на другие столбцы используются в терминах, в которых используется какой-либо оператор сравнения, отличный от =. Выбор лучшего столбца будет зависеть от того, насколько хорошо каждое условие может выбрать меньшее подмножество строк.

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

Спасибо, у меня есть сочетание операций равенства и сравнения. Я еще не смотрел видео. на «тогда порядок столбцов действительно имеет значение». Я предполагаю, что вы имеете в виду, что столбцы операции " = " должны быть помещены слева (первыми в индексе)

Mr poppins 05.04.2021 18:17

Я обновил свой ответ еще несколькими примерами.

Bill Karwin 05.04.2021 18:20

Спасибо. Это, безусловно, помогает, я уменьшу количество столбцов в индексе.

Mr poppins 05.04.2021 18:37

Другие вопросы по теме