Ao criar uma tabela no MySQL, é comum usar a cláusula KEY para definir índices. Por exemplo:
CREATE TABLE `registro_vendas` (
`cod` mediumint(8) NOT NULL AUTO_INCREMENT,
`produto` varchar(30) NOT NULL,
`categoria` mediumint(1) NOT NULL,
`descricao` text,
PRIMARY KEY (`cod`),
KEY `idx_categoria` (`categoria`)
);
Neste caso, a declaração KEY idx_categoria (categoria) cria um índice simples na coluna categoria. Isso melhora a performance de consultas que filtram por essa coluna.
No MySQL, o termo "key" pode ter significados diferentes dependendo do contexto. Em termos gerais, uma chave (key) serve tanto como uma restrição de integridade quanto como um índice. Por exemplo, uma PRIMARY KEY garante a unicidade e não permite valores nulos, além de criar automaticamente um índice principal. Da mesma forma, uma UNIQUE KEY impõe unicidade nas colunas e também gera um índice único.
Diferentemente, um índice comum (criado com INDEX ou KEY) é puramente uma estrutura física para otimização de consultas, sem impor restrições de integridade. Assim, índices ajudam a acelerar buscas, mas não controlam os dados inseridos.
Ao descrever uma tabela com o comando DESC nome_tabela, a coluna "Key" pode exibir valores como PRI, UNI ou MUL, indicando o tipo de restrição ou índice associado:
- PRI: Indica uma chave primária, que identifica de forma única cada registro.
- UNI: Indica uma chave única, garantindo que os valores na coluna sejam exclusivos, exceto para nulos.
- MUL: Indica um índice não exclusivo, permitindo valores duplicados.
Por exemplo, considere uma tabela com múltiplos índices:
CREATE TABLE `historico_acesso` (
`acesso_id` int(11) NOT NULL AUTO_INCREMENT,
`usuario` varchar(100) DEFAULT NULL,
`momento` datetime DEFAULT NULL,
`acao` varchar(100) DEFAULT NULL,
PRIMARY KEY (`acesso_id`),
KEY `idx_usuario` (`usuario`)
);
Aqui, idx_usuario é um índice simples que acelera consultas baseadas no usuário, mas não impede duplicatas.
Em contraste, uma tabela com chaves únicas poderia ser:
CREATE TABLE `alertas_seguranca` (
`aviso_id` int(10) NOT NULL AUTO_INCREMENT,
`data` date NOT NULL,
`tipo` varchar(100) NOT NULL,
`hash` varchar(100) NOT NULL,
PRIMARY KEY (`aviso_id`),
UNIQUE KEY `uk_data_hash` (`data`, `hash`)
);
A chave única uk_data_hash garante que a combinação de data e hash seja exclusiva, prevenindo inserções duplicadas.
É importente notar que chaves primárias e únicas impõem restrições, enquanto índices comuns são apenas para desempenho. No entanto, todas essas definições criam estruturas de índice no banco de dados. Por exemplo, uma chave primária automaticamente se torna um índice agrupado em engines como InnoDB.
Além disso, chaves estrangeiras (FOREIGN KEY) também atuam como restrições de intergidade referencial e, no MySQL, frequentemente geram índices automaticamente para otimizar junções.
Em resumo, ao projetar tabelas, utilize chaves para regras de integridade e índices para otimização de consultas. Lembre-se de que uma chave sempre inclui um índice, mas um índice não necessariamente impõe uma restrição.