Я как раз собираюсь написать запрос, включающий расширение WHERE isok=1
. Как следует из названия, isok
это логическое поле (фактически TINYINT(1) UNSIGNED
, для которого установлено значение 0 или 1 по мере необходимости).
Есть ли прирост производительности при индексировании этого поля? Будет ли движок (в данном случае InnoDB) работать лучше или хуже при поиске по индексу?
Ответы:
На самом деле, нет. Вы должны думать об этом как о книге. Если бы в книге было всего 3 вида слов и вы все их индексировали, у вас было бы такое же количество индексных страниц, как и у обычных страниц.
Если имеется относительно мало записей с одним значением, производительность повысится. Например, если у вас есть 1000 записей и 10 из них ИСТИНА, было бы полезно, если бы вы выполняли поиск с помощью
isok = 1
Как сказал Майкл Даррант, это также замедляет запись.
РЕДАКТИРОВАТЬ: возможное дублирование: индексирование логических полей
Здесь объясняется, что даже если у вас есть индекс, если у вас слишком много записей, индекс все равно не используется. MySQL не использует индекс при проверке = 1, но использует его с = 0
источник
Просто чтобы уточнить несколько других ответов здесь, поскольку, по моему опыту, те, кто задает подобные вопросы, находятся в той же лодке, что и мы, мы все слышали, что индексирование логических полей бессмысленно, и все же ...
У нас есть таблица с примерно 4 миллионами строк, только около 1000 или около того за раз будут отмечены логическим переключателем, и это то, что мы ищем. Добавление индекса в наше логическое поле ускорило запросы на порядки, оно увеличилось с 9+ секунд до долей секунды.
источник
WHERE my_col > 0
вместо тогоmy_col = 1
, чтобы, кажется, также помогает скоростиЭто зависит от реальных запросов и избирательности комбинации индекса / запроса.
Случай A : состояние
WHERE isok = 1
и ничего другого:Если индекс достаточно селективен (скажем, у вас 1 миллион строк и только 1 КБ
isok = 1
), тогда механизм SQL, вероятно, будет использовать индекс и будет быстрее, чем без него.Если индекс недостаточно избирательный (скажем, у вас 1 миллион строк, а их более 100 тысяч
isok = 1
), то механизм SQL, вероятно, не будет использовать индекс и выполнять сканирование таблицы.Случай B : состояние
WHERE isok = 1
и многое другое:Затем это зависит от того, какие еще у вас индексы. Индекс on
another_column
, вероятно, будет более избирательным, чем индекс,isok
который имеет только два возможных значения. Индекс на(another_column, isok)
или(isok, another_column)
было бы еще лучше.источник
Это зависит от распределения данных.
Представьте, что у меня есть книга с 1000 тщательно напечатанными страницами, и единственными словами в моей книге были «да» и «нет», повторяющиеся снова и снова и распределяемые случайным образом. Если бы меня попросили обвести все «да», поможет ли указатель в конце книги? Это зависит.
Если бы было половинное случайное распределение «да» и «нет», то поиск в индексе не помог бы. Индекс сделает книгу намного больше, и в любом случае я бы быстрее начал просто с лицевой стороны и пролистал каждую страницу, ища все случаи «да» и обводя их, вместо того, чтобы искать каждый элемент в индекс, а затем взяв ссылку из записи индекса на страницу, на которую он ссылается.
Но если бы в моей тысячестраничной книге было, скажем, всего десять случаев «да», а все остальное было бы просто миллионами «нет», то указатель сэкономил бы мне массу времени на поиск этих десяти случаев «да» и обход их. .
То же самое и с базами данных. Если это распределение 50:50, то индекс не поможет - движку базы данных лучше просто пропахать данные от начала до конца (полное сканирование таблицы), а индекс просто сделает базу данных больше, и медленнее писать и обновлять. Но если это что-то вроде распределения 4000: 1 (как указано в этой ветке), то поиск по индексу может значительно ускорить его, если вы ищете 1 элемент из 4000.
источник
Нет, обычно нет.
Обычно вы индексируете поля для поиска, когда они имеют высокую избирательность / количество элементов. Мощность логического поля в большинстве таблиц очень мала. Это также сделало бы вашу запись немного медленнее.
источник
На самом деле это зависит от выполняемых вами запросов. Но, как правило, да, как и индексация поля любого другого типа.
источник
Да, индекс повысит производительность, проверьте вывод EXPLAIN с индексом и без него.
Из документов:
Я также думаю, что в этом случае можно с уверенностью сказать, что индекс не УМЕНЬШИТ производительность, поэтому вам нужно только выиграть от него.
источник
TINYINT(1) UNSIGNED
столбец, размер данных будет небольшим.