Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL definindo coluna como UNIQUE com AUTO_INCREMENT em vez de como chave primária


Definindo MySQL sem explícito chaves primárias é uma péssima idéia.
Se um PK estiver faltando, o MySQL criará uma chave primária de autoincremento de inteiro implícito (mas muito real).
Este PK será incluído em cada chave secundária no InnoDB e determinará sua ordem de classificação primária no MyISAM.

Consequência
Você acabou de diminuir o desempenho de cada seleção, inserção e atualização.
Sem nenhum propósito.

InnoDB:pesquisa extra necessária para obter dados da tabela
No InnoDB, uma pesquisa extra precisa ser feita, pois todos os índices secundários referem-se ao PK e não às próprias linhas.

MyISAM:espaço desperdiçado
No MyISAM a penalidade não é tão grande, mas você ainda está arrastando um campo de 4 bytes não utilizado que não é usado.

InnoDB + MyISAM:geração inútil de campo de incremento automático
Porque um PK de autoincremento implícito é criado, e você também precisava de uma chave extra de autoincremento para fazer junções; Para evitar campos de autoincremento duplicados, agora você não tem 1, mas 2 bloqueios de tabela por inserção.

InnoDB:com junções, o probem de pesquisa mencionado acima duplica
Se você fizer uma junção usando um campo que não seja o PK, o InnoDB precisa fazer uma pesquisa extra por junção para obter os registros dessa outra tabela.

InnoDB:o pior de tudo é que você perde o benefício de cobrir índices
Você desativou uma das melhores otimizações do InnoDB, cobrindo índices.
Se o MySQL pode resolver a consulta usando apenas os dados nos índices, ele nunca lerá a tabela, isso resultará em uma velocidade significativa ganho. Agora que 50% de cada índice no InnoDB é espaço não utilizado, você acabou de eliminar suas chances de usar essa otimização.

Por favor, derrote este empreiteiro com um bastão de pistas!


Links:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (link lento, mas recomendo a leitura).
O'Reilly nos índices de cobertura do InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , se o seu contratante disser, não importa muito porque ele está usando o MyISAM, vença-o novamente, você deve sempre usar o InnoDB, a menos que tenha uma boa razão para não fazê-lo.
InnoDB é muito mais seguro em produção, o MyISAM tem seu usa, mas é corrompido com muita facilidade.