Diferenças entre INDEX, PRIMARY, UNIQUE, FULLTEXT no MySQL?


609

Quais são as diferenças entre PRIMARY, UNIQUE, INDEX e FULLTEXT ao criar tabelas MySQL?

Como eu os usaria?


3
Também para qualquer um curioso sobre SPATIAL: stackoverflow.com/questions/2256364/...
Leo

Para uma comparação de um primário com um índice secundário em Python, consulte este post stackoverflow.com/questions/59918440/secondary-index-in-python
Athanassios

Respostas:


674

Diferenças

  • KEY ou INDEX refere-se a um índice normal não exclusivo. Valores não distintos para o índice são permitidos, portanto, o índice pode conter linhas com valores idênticos em todas as colunas do índice. Esses índices não impõem restrições a seus dados, portanto, eles são usados ​​apenas para acesso - para alcançar rapidamente determinados intervalos de registros sem verificar todos os registros.

  • UNIQUE refere-se a um índice em que todas as linhas do índice devem ser exclusivas. Ou seja, a mesma linha pode não ter valores não NULL idênticos para todas as colunas neste índice como outra linha. Além de serem usados ​​para alcançar rapidamente determinados intervalos de registros, os índices UNIQUE podem ser usados ​​para impor restrições aos dados, porque o sistema de banco de dados não permite que a regra de valores distintos seja quebrada ao inserir ou atualizar dados.

    Seu sistema de banco de dados pode permitir que um índice UNIQUE seja aplicado a colunas que permitem valores NULL; nesse caso, duas linhas podem ser idênticas se ambas contiverem um valor NULL (a lógica aqui é que NULL é considerado diferente de si mesmo). Dependendo da sua aplicação, no entanto, você pode achar isso indesejável: se desejar evitar isso, desaproveite valores NULL nas colunas relevantes.

  • PRIMARY age exatamente como um índice UNIQUE, exceto que ele sempre é chamado 'PRIMARY', e pode haver apenas um em uma tabela (e sempre deve haver um; embora alguns sistemas de banco de dados não o imponham). Um índice PRIMARY destina-se a um meio primário para identificar exclusivamente qualquer linha da tabela; portanto, diferente de UNIQUE, ele não deve ser usado em nenhuma coluna que permita valores NULL. Seu índice PRIMARY deve estar no menor número de colunas suficientes para identificar exclusivamente uma linha. Geralmente, essa é apenas uma coluna que contém um número único incrementado automaticamente, mas se houver mais alguma coisa que possa identificar exclusivamente uma linha, como "código do país" em uma lista de países, você poderá usá-la.

    Alguns sistemas de banco de dados (como o InnoDB do MySQL) armazenam os registros de uma tabela em disco na ordem em que aparecem no índice PRIMARY.

  • Os índices FULLTEXT são diferentes de todos os itens acima e seu comportamento difere significativamente entre os sistemas de banco de dados. Os índices FULLTEXT são úteis apenas para pesquisas de texto completo feitas com a cláusula MATCH () / AGAINST (), diferentemente das três acima - que normalmente são implementadas internamente usando b-trees (permitindo selecionar, classificar ou intervalos a partir da coluna mais à esquerda) ou tabelas de hash (permitindo a seleção a partir da coluna mais à esquerda).

    Onde os outros tipos de índice são de uso geral, um índice FULLTEXT é especializado, pois serve a um propósito restrito: é usado apenas para um recurso de "pesquisa de texto completo".

Semelhanças

  • Todos esses índices podem ter mais de uma coluna.

  • Com exceção de FULLTEXT, a ordem das colunas é significativa: para que o índice seja útil em uma consulta, a consulta deve usar colunas do índice começando pela esquerda - não pode usar apenas a segunda, terceira ou quarta parte de um , a menos que ele também esteja usando as colunas anteriores no índice para corresponder aos valores estáticos. (Para que um índice FULLTEXT seja útil para uma consulta, a consulta deve usar todas as colunas do índice.)


2
isso significa que um índice FULLTEXT é essencialmente inútil e uma cintura de espaço se você não usar MATCH () / AGAINST () em suas consultas?
User1397417

5
Sim. Também é usado apenas para bancos de dados MyISAM no MySQL, não no InnoDB. Outros servidores de banco de dados podem ter recursos equivalentes que podem funcionar de maneira diferente.
thomasrutter

"não deve ser usado em nenhuma coluna que permita valores NULL" -> deve ser "não pode ser usado". Chaves primárias são necessariamente NOT NULL. O MySQL reportará show columnsque uma chave exclusiva que não seja NULL é uma chave primária, se não houver outras chaves primárias definidas.
Gordon Linoff

1
A lógica aqui é que NULL é considerado não igual a si mesmo .. Lol eu não vou esquecer isso
Hos Mercury

2
@thomasrutter MySQL suportando FULLTEXT no InnoDB a partir da versão 5.6
Marek Skiba

151

Todos esses são tipos de índices.

primário: deve ser único, é um índice, é (provavelmente) o índice físico, pode ser apenas um por tabela.

único: como diz. Você não pode ter mais de uma linha com uma tupla desse valor. Observe que, como uma chave exclusiva pode ter mais de uma coluna, isso não significa necessariamente que cada coluna individual no índice seja única, mas que cada combinação de valores nessas colunas é única.

índice: se não for primário ou exclusivo, não restringe os valores inseridos na tabela, mas permite que eles sejam pesquisados ​​com mais eficiência.

texto completo: uma forma mais especializada de indexação que permite a pesquisa de texto completo. Pense nisso como (essencialmente) criando um "índice" para cada "palavra" na coluna especificada.


32
Os primários podem ser compostos, ou seja, com várias chaves, no MySQL (e em muitos outros bancos de dados). Eles são apenas um índice especial. Exclusivo não é realmente um índice, é uma restrição (que exige que um índice seja aplicado em quantidades razoáveis ​​de tempo, criando assim um).
MBCook 02/04/09

19

Eu sinto que isso foi bem coberto, talvez, exceto pelo seguinte:

  • Simples KEY/ INDEX(ou chamado de outra forma SECONDARY INDEX) aumenta o desempenho se a seletividade for suficiente. Sobre esse assunto, a recomendação usual é que, se a quantidade de registros no conjunto de resultados em que um índice é aplicado exceder 20% da quantidade total de registros da tabela pai, o índice será ineficaz. Na prática, cada arquitetura será diferente, mas a ideia ainda está correta.

  • Índices secundários (e isso é muito específico para o mysql) não devem ser vistos como objetos completamente separados e diferentes da chave primária. De fato, ambos devem ser usados ​​em conjunto e, uma vez conhecidas essas informações, fornecem uma ferramenta adicional ao DBA do mysql: no Mysql, os índices incorporam a chave primária. Isso leva a melhorias significativas de desempenho, especificamente ao criar inteligentemente índices de cobertura implícitos, como os descritos aqui

  • Se você acha que seus dados deveriam ser UNIQUE, use um índice exclusivo. Você pode pensar que é opcional (por exemplo, trabalhar no nível do aplicativo) e que um índice normal funcionará, mas na verdade representa uma garantia para o Mysql de que cada linha é única, o que aliás fornece um benefício de desempenho.

  • Você só pode usar FULLTEXT(ou de outra forma chamado SEARCH INDEX) com o Innodb (no MySQL 5.6.4 e superior) e o Myisam Engines

  • Você só pode usar FULLTEXTem CHAR, VARCHARe TEXTtipos de colunas
  • FULLTEXTO índice envolve muito mais do que apenas criar um índice. Há várias tabelas de sistema criadas, um sistema de cache completamente separado e algumas regras e otimizações específicas aplicadas. Consulte http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html e http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.