Есть ли прирост производительности при индексировании логического поля?
Я как раз собираюсь написать запрос, который включает в себя WHERE isok=1
. Как следует из названия, isok
- Это логическое поле (на самом деле TINYINT(1) UNSIGNED
это значение равно 0 или 1 по мере необходимости).
есть ли прирост производительности при индексации этого поля? Будет ли двигатель (InnoDB в этом случае) работать лучше или хуже, глядя на индекс?
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 предметов, которые вы ищете.