Есть ли прирост производительности при индексировании логического поля?


Я как раз собираюсь написать запрос, который включает в себя WHERE isok=1. Как следует из названия, isok - Это логическое поле (на самом деле TINYINT(1) UNSIGNED это значение равно 0 или 1 по мере необходимости).

есть ли прирост производительности при индексации этого поля? Будет ли двигатель (InnoDB в этом случае) работать лучше или хуже, глядя на индекс?

7 69

7 ответов:

Не совсем так. Вы должны думать об этом как о книге. Если бы в книге было только 3 вида слов, и вы индексируете их все, у вас было бы такое же количество индексных страниц, как и обычные страницы.

было бы увеличение производительности, если есть относительно мало записей одного значения. Например, если у вас есть 1000 записей и 10 из них истинны, то было бы полезно, если вы ищете с isok = 1

Как упоминал Майкл Даррант, он также делает записи замедлившийся.

редактировать: возможно дублирование: индексирование логических полей

здесь объясняется, что даже если у вас есть индекс, если у вас слишком много записей, он все равно не использует индекс. MySQL не использует индекс при проверке = 1, но использует его с = 0

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

У нас есть таблица с около 4 миллионов строк, только около 1000 или около того в то время будет иметь логический переключатель помечен, и это то, что мы ищем против. Добавление индекса в наше логическое поле ускорило запросы на порядки, это заняло около 9 + секунд на долю секунды.

это зависит от фактических запросов и селективности комбинации индекса/запроса.

Случае: условие WHERE isok = 1 и ничего нет:

SELECT *
FROM tableX
WHERE isok = 1
  • если индекс достаточно селективен (скажем, у вас есть 1M строк и только 1k есть isok = 1), то SQL двигатель, вероятно,использовать индекс и быть быстрее, чем без него.

  • если индекс не является достаточно избирательным (скажем, у вас есть 1M строк и более 100k имеют isok = 1), то SQL двигатель, вероятно,не использовать индекс и сделать сканирование таблицы.

Дело B: условие WHERE isok = 1 и:

SELECT *
FROM tableX
WHERE isok = 1
  AND another_column = 17

затем, это зависит от того, какие другие индексы у вас есть. Индекс на another_column вероятно, будет более избирательным, чем индекс на isok, которая имеет только два возможных значения. Индекс на (another_column, isok) или (isok, another_column) было бы еще лучше.

нет, обычно нет.

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

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

документы:

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

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

Это зависит от распределения данных.

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

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

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

то же самое в базах данных. Если это распределение 50:50, то индекс не поможет - движку базы данных лучше просто пропахать данные от начала до конца (полное сканирование таблицы), и индекс просто сделает базу данных больше и медленнее писать и обновлять. Но если это что-то вроде распределения 4000:1 (согласно oucil в этой теме), то индекс поиска может ускорить его чрезвычайно, если это 1 в 4000 предметов, которые вы ищете.

на самом деле это зависит от запросов запуске. Но, в общем да, как и индексирование поля любого другого типа.