Estou prestes a escrever uma consulta que inclui um WHERE isok=1
. Como o nome indica, isok
é um campo booleano (na verdade, um TINYINT(1) UNSIGNED
que é definido como 0 ou 1 conforme necessário).
Existe algum ganho de desempenho na indexação deste campo? O mecanismo (InnoDB neste caso) teria um desempenho melhor ou pior procurando o índice?
Respostas:
Na verdade não. Você deve pensar nisso como um livro. Se houvesse apenas 3 tipos de palavras em um livro e você indexasse todas elas, você teria o mesmo número de páginas de índice que as páginas normais.
Haveria um ganho de desempenho se houver relativamente poucos registros de um valor. Por exemplo, se você tiver 1000 registros e 10 deles forem verdadeiros, seria útil se você pesquisar com
isok = 1
Como Michael Durrant mencionou, também torna as gravações mais lentas.
EDIT: Possível duplicação: Indexação de campos booleanos
Aqui ele explica que mesmo se você tiver um índice, se você tiver muitos registros, ele não usará o índice de qualquer maneira. MySQL não usa índice ao verificar = 1, mas o usa com = 0
fonte
Só para esclarecer várias outras respostas aqui, já que, na minha experiência, aqueles que olham para perguntas como esta estão no mesmo barco que nós, todos nós ouvimos que indexar campos booleanos é inútil, e ainda ...
Temos uma tabela com cerca de 4 milhões de linhas, apenas cerca de 1000 de cada vez terão um switch Booleano sinalizado e é isso que procuramos. Adicionar um índice em nosso campo booleano acelerou as consultas em ordens de magnitude, passou de cerca de 9+ segundos para uma fração de segundo.
fonte
WHERE my_col > 0
em vez demy_col = 1
também parece ajudar a acelerarDepende das consultas reais e da seletividade da combinação índice / consulta.
Caso A : condição
WHERE isok = 1
e nada mais lá:Se o índice for seletivo o suficiente (digamos que você tenha 1 milhão de linhas e apenas 1k
isok = 1
), o mecanismo SQL provavelmente usará o índice e será mais rápido do que sem ele.Se o índice não for seletivo o suficiente (digamos que você tenha 1 milhão de linhas e mais de 100k
isok = 1
), o mecanismo SQL provavelmente não usará o índice e fará uma verificação de tabela.Caso B : condição
WHERE isok = 1
e mais coisas:Então, depende de quais outros índices você tem. Um índice em
another_column
provavelmente seria mais seletivo do que o índice emisok
que tem apenas dois valores possíveis. Um índice em(another_column, isok)
ou(isok, another_column)
seria ainda melhor.fonte
Depende da distribuição dos dados.
Imagine que eu tivesse um livro com 1000 páginas digitadas com precisão, e as únicas palavras em meu livro eram 'sim' e 'não' repetidas continuamente e distribuídas aleatoriamente. Se eu fosse solicitado a circular todas as ocorrências de 'sim', um índice no final do livro ajudaria? Depende.
Se houvesse uma distribuição aleatória meio a meio de sim e não, pesquisar no índice não ajudaria. O índice tornaria o livro muito maior e, de qualquer forma, seria mais rápido apenas começar do início e trabalhar cada página procurando todas as ocorrências de "sim" e circulando-as, em vez de procurar cada item em o índice e, em seguida, tomando a referência da entrada do índice para a página a que se refere.
Mas se houvesse, digamos, apenas dez ocorrências de 'sim' em meu livro de mil páginas e todo o resto fosse apenas milhões de não, então um índice me pouparia muito tempo para encontrar essas dez ocorrências de 'sim' e circulá-las .
É o mesmo em bancos de dados. Se for uma distribuição 50:50, então um índice não vai ajudar - o mecanismo de banco de dados é melhor apenas lavando os dados do início ao fim (varredura completa da tabela), e o índice apenas aumentaria o banco de dados, e mais lento para escrever e atualizar. Mas se for algo como uma distribuição de 4000: 1 (como mostrado neste tópico), uma busca de índice pode acelerá-la enormemente, se for 1 em 4000 itens que você está procurando.
fonte
Não, geralmente não.
Normalmente, você indexa campos para pesquisa quando eles têm alta seletividade / cardinalidade. A cardinalidade de um campo booleano é muito baixa na maioria das tabelas. Isso também tornaria suas gravações um pouco mais lentas.
fonte
Na verdade, isso depende das consultas que você executa. Mas, geralmente sim, assim como indexar um campo de qualquer outro tipo.
fonte
Sim, um índice melhorará o desempenho, verifique a saída de EXPLAIN com e sem o índice.
Dos documentos:
Eu acho que também é seguro dizer que um índice não DIMINUI o desempenho neste caso, então você só tem a ganhar com isso.
fonte
TINYINT(1) UNSIGNED
coluna, o tamanho dos dados será pequeno.