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

As colunas VARCHAR devem ser colocadas no final das definições de tabela no MySQL?


Fazer essa pergunta sobre "MySQL" não é útil, pois o MySQL relega o armazenamento a mecanismos de armazenamento e eles implementam o armazenamento de maneiras muito diferentes. Faz sentido fazer essa pergunta para qualquer mecanismo de armazenamento individual.

No mecanismo MEMORY, não existem tipos de dados de comprimento variável. Um VARCHAR é alterado silenciosamente para um CHAR. No contexto da sua pergunta:Não importa onde em uma definição de tabela você coloque seu VARCHAR.

No mecanismo MyISAM, se uma tabela não possui dados de comprimento variável (VARCHAR, VARBINARY ou qualquer tipo TEXT ou BLOB) ela é da variante FIXED de MyISAM, ou seja, os registros têm um comprimento de byte fixo. Isso pode ter implicações de desempenho, especialmente se os dados forem excluídos e inseridos repetidamente (ou seja, a tabela não é apenas anexada). Assim que qualquer tipo de dados de comprimento variável faz parte de uma definição de tabela, ele se torna a variante DYNAMIC de MyISAM, e MyISAM altera internamente qualquer tipo de CHAR mais curto internamente para VARCHAR. Novamente, a posição e até mesmo a definição de CHAR/VARCHAR não importam.

No mecanismo InnoDB, os dados são armazenados em páginas de 16 KB. Uma página tem um rodapé de página com uma soma de verificação e um cabeçalho de página, com, entre outras coisas, um diretório de página. O diretório de páginas contém para cada linha o deslocamento dessa linha em relação ao início da página. Uma página também contém espaço livre e todas as E/S são feitas em páginas.

Portanto, o InnoDB pode, desde que haja espaço livre em uma página, aumentar o VARCHAR no local e mover linhas dentro de uma página, sem incorrer em nenhuma E/S adicional. Além disso, como todas as linhas estão sendo endereçadas como (número da página, entrada do diretório da página), o movimento de uma linha dentro de uma página é localizado na página e não é visível do lado de fora.

Isso também significa que para o InnoDB, a ordem das colunas dentro de uma linha não importa.

Esses são os três mecanismos de armazenamento mais comumente usados ​​com o MySQL, e a ordem das colunas não importa para nenhum desses três. Pode ser que existam outros mecanismos de armazenamento mais exóticos para os quais isso não seja verdade.