Quais são as diferenças entre PRIMARY, UNIQUE, INDEX e FULLTEXT ao criar tabelas MySQL?
Como eu os usaria?
Quais são as diferenças entre PRIMARY, UNIQUE, INDEX e FULLTEXT ao criar tabelas MySQL?
Como eu os usaria?
Respostas:
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".
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.)
NOT NULL
. O MySQL reportará show columns
que uma chave exclusiva que não seja NULL é uma chave primária, se não houver outras chaves primárias definidas.
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.
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
FULLTEXT
em CHAR
, VARCHAR
e TEXT
tipos de colunasFULLTEXT
O í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
SPATIAL
: stackoverflow.com/questions/2256364/...